Load data

Internal

CN

Read raw

Templates

Merge raw w/ template

14C

Mass


Call:
lm(formula = loss_pct ~ PM + ECO, data = sra.frc.mss.lss.df[-which(sra.frc.mss.lss.df$Probe == 
    "BSpp_comp_2001_18-28"), ])

Residuals:
    Min      1Q  Median      3Q     Max 
-4.1953 -0.9261 -0.4445  0.7965  5.7767 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)   4.8136     0.5726   8.406 1.06e-10 ***
PMBS         -0.1405     0.6486  -0.217 0.829539    
PMGR         -2.3959     0.6382  -3.754 0.000507 ***
ECOwf        -1.0117     0.6382  -1.585 0.120098    
ECOrf        -1.7850     0.6394  -2.792 0.007729 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 1.831 on 44 degrees of freedom
Multiple R-squared:  0.3641,    Adjusted R-squared:  0.3063 
F-statistic: 6.299 on 4 and 44 DF,  p-value: 0.0004255

Interestingly, it appears that AN soils have proportionally LESS minC by mass than do GR or BS soils, significantly so at depth. Why would this be? Possibly because AN soils have higher losses (DOC) during fractionation?

External data

Atmosphere

from C. Rasmussen (’01 C, N; ’09 14C, frc mass, C, N)

calculating Δ14C from fraction modern

Analysis

Misc. functions

Bulk C

2001

2009

2019

`summarise()` has grouped output by 'PMeco'. You can override using the `.groups` argument.

Fraction C

C, CN profiles

[[1]]

[[2]]

[[3]]

[[1]]

[[2]]

[[3]]

[[1]]

[[2]]

[[3]]

[[1]]

[[2]]

[[3]]

C distribution

Error in rbind(deparse.level, ...) : 
  numbers of columns of arguments do not match

Fraction 14C

Depth profiles

Spline ’01, ’09

Spline C

converting IDs from factor to characterconverting IDs from factor to characterconverting IDs from factor to characterconverting IDs from factor to characterconverting IDs from factor to characterconverting IDs from factor to characterconverting IDs from factor to characterconverting IDs from factor to characterconverting IDs from factor to characterconverting IDs from factor to characterconverting IDs from factor to characterconverting IDs from factor to characterconverting IDs from factor to characterconverting IDs from factor to characterconverting IDs from factor to characterconverting IDs from factor to characterconverting IDs from factor to characterconverting IDs from factor to characterconverting IDs from factor to characterconverting IDs from factor to characterconverting IDs from factor to characterconverting IDs from factor to characterconverting IDs from factor to characterconverting IDs from factor to characterconverting IDs from factor to characterconverting IDs from factor to characterconverting IDs from factor to character
[[1]]

[[2]]

[[3]]

Spline 14C

C-weighted 14C spline

14C time series

$`10`

$`20`

$`30`

$`10`

$`20`

$`30`

$emtrends
 PMeco year.trend   SE df lower.CL upper.CL
 ANpp      -6.795 2.07  9   -11.47    -2.12
 ANrf      -1.018 2.07  9    -5.70     3.66
 ANwf      -0.681 2.07  9    -5.36     4.00
 BSpp      -1.842 2.07  9    -6.52     2.84
 BSrf      -2.766 2.07  9    -7.44     1.91
 BSwf      -1.453 2.07  9    -6.13     3.23
 GRpp      -4.189 2.07  9    -8.87     0.49
 GRrf      -0.779 2.07  9    -5.46     3.90
 GRwf      -2.078 2.07  9    -6.76     2.60

Confidence level used: 0.95 

$contrasts
 contrast    estimate   SE df t.ratio p.value
 ANpp - ANrf  -5.7768 2.92  9 -1.975  0.5893 
 ANpp - ANwf  -6.1137 2.92  9 -2.090  0.5287 
 ANpp - BSpp  -4.9532 2.92  9 -1.694  0.7388 
 ANpp - BSrf  -4.0290 2.92  9 -1.378  0.8815 
 ANpp - BSwf  -5.3424 2.92  9 -1.827  0.6689 
 ANpp - GRpp  -2.6063 2.92  9 -0.891  0.9879 
 ANpp - GRrf  -6.0161 2.92  9 -2.057  0.5460 
 ANpp - GRwf  -4.7170 2.92  9 -1.613  0.7792 
 ANrf - ANwf  -0.3370 2.92  9 -0.115  1.0000 
 ANrf - BSpp   0.8235 2.92  9  0.282  1.0000 
 ANrf - BSrf   1.7477 2.92  9  0.598  0.9991 
 ANrf - BSwf   0.4344 2.92  9  0.149  1.0000 
 ANrf - GRpp   3.1704 2.92  9  1.084  0.9630 
 ANrf - GRrf  -0.2394 2.92  9 -0.082  1.0000 
 ANrf - GRwf   1.0598 2.92  9  0.362  1.0000 
 ANwf - BSpp   1.1605 2.92  9  0.397  1.0000 
 ANwf - BSrf   2.0847 2.92  9  0.713  0.9971 
 ANwf - BSwf   0.7714 2.92  9  0.264  1.0000 
 ANwf - GRpp   3.5074 2.92  9  1.199  0.9377 
 ANwf - GRrf   0.0976 2.92  9  0.033  1.0000 
 ANwf - GRwf   1.3967 2.92  9  0.478  0.9998 
 BSpp - BSrf   0.9242 2.92  9  0.316  1.0000 
 BSpp - BSwf  -0.3891 2.92  9 -0.133  1.0000 
 BSpp - GRpp   2.3469 2.92  9  0.802  0.9937 
 BSpp - GRrf  -1.0629 2.92  9 -0.363  1.0000 
 BSpp - GRwf   0.2362 2.92  9  0.081  1.0000 
 BSrf - BSwf  -1.3133 2.92  9 -0.449  0.9999 
 BSrf - GRpp   1.4227 2.92  9  0.486  0.9998 
 BSrf - GRrf  -1.9871 2.92  9 -0.679  0.9979 
 BSrf - GRwf  -0.6880 2.92  9 -0.235  1.0000 
 BSwf - GRpp   2.7360 2.92  9  0.935  0.9838 
 BSwf - GRrf  -0.6737 2.92  9 -0.230  1.0000 
 BSwf - GRwf   0.6254 2.92  9  0.214  1.0000 
 GRpp - GRrf  -3.4098 2.92  9 -1.166  0.9459 
 GRpp - GRwf  -2.1107 2.92  9 -0.722  0.9968 
 GRrf - GRwf   1.2991 2.92  9  0.444  0.9999 

P value adjustment: tukey method for comparing a family of 9 estimates 

Call:
lm(formula = frc_14c ~ year_i * pm * eco, data = dens.01.09.19.sp.df[dens.01.09.19.sp.df$frc == 
    "fPOM" & dens.01.09.19.sp.df$lyr_bot == 10, ])

Residuals:
    Min      1Q  Median      3Q     Max 
-36.987  -8.459  -3.794  14.059  31.963 

Coefficients:
                         Estimate Std. Error t value Pr(>|t|)    
(Intercept)               165.512     25.131   6.586 0.000101 ***
year_i                     -6.795      2.068  -3.286 0.009443 ** 
pmbasalt                  -43.636     35.541  -1.228 0.250674    
pmgranite                 -23.223     35.541  -0.653 0.529818    
ecocool                  -168.432     35.541  -4.739 0.001060 ** 
ecocold                  -104.629     35.541  -2.944 0.016382 *  
year_i:pmbasalt             4.953      2.925   1.694 0.124591    
year_i:pmgranite            2.606      2.925   0.891 0.396052    
year_i:ecocool              6.114      2.925   2.090 0.066144 .  
year_i:ecocold              5.777      2.925   1.975 0.079678 .  
pmbasalt:ecocool           93.779     50.262   1.866 0.094932 .  
pmgranite:ecocool         103.988     50.262   2.069 0.068483 .  
pmbasalt:ecocold           62.329     50.262   1.240 0.246303    
pmgranite:ecocold          17.972     50.262   0.358 0.728903    
year_i:pmbasalt:ecocool    -5.725      4.136  -1.384 0.199702    
year_i:pmgranite:ecocool   -4.003      4.136  -0.968 0.358422    
year_i:pmbasalt:ecocold    -6.701      4.136  -1.620 0.139664    
year_i:pmgranite:ecocold   -2.367      4.136  -0.572 0.581154    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 26.38 on 9 degrees of freedom
Multiple R-squared:  0.8821,    Adjusted R-squared:  0.6595 
F-statistic: 3.962 on 17 and 9 DF,  p-value: 0.02039


Call:
lm(formula = frc_14c ~ year_i * pm * eco, data = dens.01.09.19.sp.df[dens.01.09.19.sp.df$frc == 
    "fPOM" & dens.01.09.19.sp.df$lyr_bot == 20, ])

Residuals:
    Min      1Q  Median      3Q     Max 
-26.206  -9.681  -4.089   6.602  47.172 

Coefficients:
                         Estimate Std. Error t value Pr(>|t|)  
(Intercept)                78.039     28.446   2.743   0.0227 *
year_i                     -4.217      2.341  -1.801   0.1052  
pmbasalt                    2.083     40.229   0.052   0.9598  
pmgranite                 -34.956     40.229  -0.869   0.4075  
ecocool                  -127.141     40.229  -3.160   0.0115 *
ecocold                   -68.688     40.229  -1.707   0.1219  
year_i:pmbasalt             3.623      3.311   1.094   0.3022  
year_i:pmgranite            8.217      3.311   2.482   0.0349 *
year_i:ecocool              4.120      3.311   1.245   0.2447  
year_i:ecocold              3.572      3.311   1.079   0.3086  
pmbasalt:ecocool           71.432     56.892   1.256   0.2409  
pmgranite:ecocool         113.279     56.892   1.991   0.0777 .
pmbasalt:ecocold           47.147     56.892   0.829   0.4287  
pmgranite:ecocold          37.800     56.892   0.664   0.5231  
year_i:pmbasalt:ecocool    -6.787      4.682  -1.450   0.1811  
year_i:pmgranite:ecocool  -10.673      4.682  -2.280   0.0486 *
year_i:pmbasalt:ecocold    -5.429      4.682  -1.160   0.2761  
year_i:pmgranite:ecocold   -8.132      4.682  -1.737   0.1164  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 29.86 on 9 degrees of freedom
Multiple R-squared:  0.8625,    Adjusted R-squared:  0.6027 
F-statistic:  3.32 on 17 and 9 DF,  p-value: 0.03583


Call:
lm(formula = frc_14c ~ year_i * pm * eco, data = dens.01.09.19.sp.df[dens.01.09.19.sp.df$frc == 
    "fPOM" & dens.01.09.19.sp.df$lyr_bot == 30, ])

Residuals:
   Min     1Q Median     3Q    Max 
-32.57 -11.84  -3.65   7.70  58.63 

Coefficients:
                         Estimate Std. Error t value Pr(>|t|)
(Intercept)               -7.7862    34.5553  -0.225    0.827
year_i                    -0.5033     2.8436  -0.177    0.863
pmbasalt                  57.2270    48.8686   1.171    0.272
pmgranite                 19.0016    48.8686   0.389    0.706
ecocool                  -67.2614    48.8686  -1.376    0.202
ecocold                  -27.5273    48.8686  -0.563    0.587
year_i:pmbasalt            0.5886     4.0215   0.146    0.887
year_i:pmgranite           3.3000     4.0215   0.821    0.433
year_i:ecocool             0.9728     4.0215   0.242    0.814
year_i:ecocold             1.3306     4.0215   0.331    0.748
pmbasalt:ecocool          45.7950    69.1106   0.663    0.524
pmgranite:ecocool         65.6280    69.1106   0.950    0.367
pmbasalt:ecocold          -1.7179    69.1106  -0.025    0.981
pmgranite:ecocold          3.6995    69.1106   0.054    0.958
year_i:pmbasalt:ecocool   -7.3011     5.6873  -1.284    0.231
year_i:pmgranite:ecocool  -5.8728     5.6873  -1.033    0.329
year_i:pmbasalt:ecocold   -2.4287     5.6873  -0.427    0.679
year_i:pmgranite:ecocold  -3.7023     5.6873  -0.651    0.531

Residual standard error: 36.27 on 9 degrees of freedom
Multiple R-squared:  0.776, Adjusted R-squared:  0.353 
F-statistic: 1.835 on 17 and 9 DF,  p-value: 0.178


Call:
lm(formula = frc_14c ~ year_i * pm * eco, data = dens.01.09.19.sp.df[dens.01.09.19.sp.df$frc == 
    "minC" & dens.01.09.19.sp.df$lyr_bot == 10, ])

Residuals:
    Min      1Q  Median      3Q     Max 
-32.445 -14.690  -0.982   8.313  49.666 

Coefficients:
                            Estimate  Std. Error t value Pr(>|t|)  
(Intercept)                53.235715   31.836582   1.672   0.1288  
year_i                     -1.368463    2.619903  -0.522   0.6141  
pmbasalt                  -11.392863   45.023726  -0.253   0.8059  
pmgranite                  13.808110   45.023726   0.307   0.7661  
ecocool                  -129.550490   45.023726  -2.877   0.0183 *
ecocold                   -53.252323   45.023726  -1.183   0.2672  
year_i:pmbasalt             1.011690    3.705102   0.273   0.7910  
year_i:pmgranite           -0.008576    3.705102  -0.002   0.9982  
year_i:ecocool              3.341545    3.705102   0.902   0.3906  
year_i:ecocold             -0.800799    3.705102  -0.216   0.8337  
pmbasalt:ecocool          100.351702   63.673164   1.576   0.1495  
pmgranite:ecocool         101.017634   63.673164   1.587   0.1471  
pmbasalt:ecocold           -2.086764   63.673164  -0.033   0.9746  
pmgranite:ecocold         -45.174314   63.673164  -0.709   0.4960  
year_i:pmbasalt:ecocool    -2.576587    5.239806  -0.492   0.6347  
year_i:pmgranite:ecocool   -3.747488    5.239806  -0.715   0.4926  
year_i:pmbasalt:ecocold     2.650378    5.239806   0.506   0.6251  
year_i:pmgranite:ecocold    4.370745    5.239806   0.834   0.4258  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 33.41 on 9 degrees of freedom
Multiple R-squared:  0.7665,    Adjusted R-squared:  0.3254 
F-statistic: 1.738 on 17 and 9 DF,  p-value: 0.2008


Call:
lm(formula = frc_14c ~ year_i * pm * eco, data = dens.01.09.19.sp.df[dens.01.09.19.sp.df$frc == 
    "minC" & dens.01.09.19.sp.df$lyr_bot == 20, ])

Residuals:
    Min      1Q  Median      3Q     Max 
-25.918  -9.446  -2.474   9.149  31.546 

Coefficients:
                         Estimate Std. Error t value Pr(>|t|)  
(Intercept)               -9.5997    21.9478  -0.437   0.6721  
year_i                     0.7565     1.8061   0.419   0.6851  
pmbasalt                  -8.2247    31.0389  -0.265   0.7970  
pmgranite                -11.4347    31.0389  -0.368   0.7211  
ecocool                  -94.7296    31.0389  -3.052   0.0137 *
ecocold                  -15.3565    31.0389  -0.495   0.6326  
year_i:pmbasalt            0.7698     2.5543   0.301   0.7700  
year_i:pmgranite           3.0074     2.5543   1.177   0.2692  
year_i:ecocool             1.2303     2.5543   0.482   0.6415  
year_i:ecocold            -2.6857     2.5543  -1.051   0.3205  
pmbasalt:ecocool         127.3757    43.8956   2.902   0.0175 *
pmgranite:ecocool        124.8421    43.8956   2.844   0.0193 *
pmbasalt:ecocold          -0.9729    43.8956  -0.022   0.9828  
pmgranite:ecocold        -31.2191    43.8956  -0.711   0.4950  
year_i:pmbasalt:ecocool   -4.6467     3.6123  -1.286   0.2304  
year_i:pmgranite:ecocool  -5.8824     3.6123  -1.628   0.1379  
year_i:pmbasalt:ecocold    2.9547     3.6123   0.818   0.4345  
year_i:pmgranite:ecocold   2.1864     3.6123   0.605   0.5599  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 23.04 on 9 degrees of freedom
Multiple R-squared:  0.8619,    Adjusted R-squared:  0.6011 
F-statistic: 3.305 on 17 and 9 DF,  p-value: 0.03635


Call:
lm(formula = frc_14c ~ year_i * pm * eco, data = dens.01.09.19.sp.df[dens.01.09.19.sp.df$frc == 
    "minC" & dens.01.09.19.sp.df$lyr_bot == 30, ])

Residuals:
    Min      1Q  Median      3Q     Max 
-21.580  -9.094   3.950   6.546  38.845 

Coefficients:
                         Estimate Std. Error t value Pr(>|t|)  
(Intercept)              -54.2864    20.6763  -2.626   0.0276 *
year_i                     1.7628     1.7015   1.036   0.3272  
pmbasalt                  -4.1368    29.2407  -0.141   0.8906  
pmgranite                -39.1905    29.2407  -1.340   0.2130  
ecocool                  -58.1383    29.2407  -1.988   0.0780 .
ecocold                   15.4194    29.2407   0.527   0.6107  
year_i:pmbasalt           -0.1398     2.4063  -0.058   0.9550  
year_i:pmgranite           3.6500     2.4063   1.517   0.1636  
year_i:ecocool            -1.0213     2.4063  -0.424   0.6812  
year_i:ecocold            -5.3002     2.4063  -2.203   0.0551 .
pmbasalt:ecocool         132.3396    41.3525   3.200   0.0108 *
pmgranite:ecocool        133.4644    41.3525   3.227   0.0104 *
pmbasalt:ecocold         -34.7870    41.3525  -0.841   0.4220  
pmgranite:ecocold         -6.5936    41.3525  -0.159   0.8768  
year_i:pmbasalt:ecocool   -4.8607     3.4030  -1.428   0.1870  
year_i:pmgranite:ecocool  -4.8928     3.4030  -1.438   0.1843  
year_i:pmbasalt:ecocold    6.4371     3.4030   1.892   0.0911 .
year_i:pmgranite:ecocold   3.3074     3.4030   0.972   0.3565  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 21.7 on 9 degrees of freedom
Multiple R-squared:  0.8748,    Adjusted R-squared:  0.6383 
F-statistic: 3.699 on 17 and 9 DF,  p-value: 0.0255
NOTE: Results may be misleading due to involvement in interactions
NOTE: Results may be misleading due to involvement in interactions
NOTE: Results may be misleading due to involvement in interactions
NOTE: Results may be misleading due to involvement in interactions
NOTE: Results may be misleading due to involvement in interactions

Char pool calc

Fraction vs respired 14C


Call:
lm(formula = fPOM ~ d14c * pm * eco, data = dens.inc.reps.w)

Residuals:
    Min      1Q  Median      3Q     Max 
-59.479 -10.962  -2.964  13.622  56.625 

Coefficients:
                       Estimate Std. Error t value Pr(>|t|)   
(Intercept)            -46.8010    16.9411  -2.763  0.00725 **
d14c                     1.0008     0.2921   3.426  0.00101 **
pmbasalt                43.3810    24.1340   1.798  0.07639 . 
pmgranite               43.0356    19.5950   2.196  0.03125 * 
ecocool                -38.8844    37.2750  -1.043  0.30031   
ecowarm                 15.4182    19.7989   0.779  0.43865   
d14c:pmbasalt           -0.4179     0.3512  -1.190  0.23791   
d14c:pmgranite          -0.2566     0.3554  -0.722  0.47254   
d14c:ecocool            -0.4688     0.5535  -0.847  0.39982   
d14c:ecowarm             0.1097     0.3147   0.349  0.72834   
pmbasalt:ecocool       -14.2091    41.9264  -0.339  0.73565   
pmgranite:ecocool       28.0420    39.6631   0.707  0.48181   
pmbasalt:ecowarm        26.1699    29.2181   0.896  0.37337   
pmgranite:ecowarm       15.1343    24.9114   0.608  0.54539   
d14c:pmbasalt:ecocool    0.7267     0.5999   1.211  0.22967   
d14c:pmgranite:ecocool   0.5756     0.5987   0.961  0.33951   
d14c:pmbasalt:ecowarm   -0.1299     0.4082  -0.318  0.75112   
d14c:pmgranite:ecowarm  -0.1381     0.3939  -0.350  0.72699   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 22.62 on 73 degrees of freedom
Multiple R-squared:  0.8853,    Adjusted R-squared:  0.8586 
F-statistic: 33.14 on 17 and 73 DF,  p-value: < 2.2e-16


Call:
lm(formula = minC ~ d14c * pm * eco + year, data = dens.inc.reps.w)

Residuals:
   Min     1Q Median     3Q    Max 
-73.03 -10.91   2.62  13.50  57.87 

Coefficients:
                        Estimate Std. Error t value      Pr(>|t|)    
(Intercept)            -121.9498    17.6236  -6.920 0.00000000155 ***
d14c                      0.7669     0.2857   2.684      0.009017 ** 
pmbasalt                111.7400    23.6361   4.728 0.00001098055 ***
pmgranite                88.6981    19.0431   4.658 0.00001425529 ***
ecocool                  -8.2650    36.4407  -0.227      0.821217    
ecowarm                  82.1645    19.2602   4.266 0.00005960539 ***
year2019                 20.4426     6.0751   3.365      0.001230 ** 
d14c:pmbasalt            -0.8841     0.3444  -2.568      0.012318 *  
d14c:pmgranite           -0.5648     0.3455  -1.635      0.106480    
d14c:ecocool             -0.4567     0.5401  -0.846      0.400524    
d14c:ecowarm             -0.2215     0.3056  -0.725      0.470966    
pmbasalt:ecocool        -34.0345    41.5389  -0.819      0.415296    
pmgranite:ecocool        17.2802    38.8323   0.445      0.657658    
pmbasalt:ecowarm       -131.4919    28.5973  -4.598 0.00001779658 ***
pmgranite:ecowarm       -83.9280    24.2075  -3.467      0.000892 ***
d14c:pmbasalt:ecocool     1.1027     0.5893   1.871      0.065396 .  
d14c:pmgranite:ecocool    0.6565     0.5863   1.120      0.266566    
d14c:pmbasalt:ecowarm     1.2436     0.4000   3.109      0.002689 ** 
d14c:pmgranite:ecowarm    0.7410     0.3852   1.924      0.058362 .  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 21.96 on 72 degrees of freedom
Multiple R-squared:  0.8299,    Adjusted R-squared:  0.7874 
F-statistic: 19.52 on 18 and 72 DF,  p-value: < 2.2e-16
NOTE: Results may be misleading due to involvement in interactions
NOTE: Results may be misleading due to involvement in interactions
NOTE: Results may be misleading due to involvement in interactions
NOTE: Results may be misleading due to involvement in interactions
NOTE: Results may be misleading due to involvement in interactions
NOTE: Results may be misleading due to involvement in interactions
NOTE: Results may be misleading due to involvement in interactions
NOTE: Results may be misleading due to involvement in interactions

Thermal fractions

C release (thermograms)

Thermal fraction 14C

Currently analysing dataframe 
Between 0 and 140 degrees C the proportion of sample C is 0.001488078 
Between 140 and 245 degrees C the proportion of sample C is 0.03870194 
Between 245 and 340 degrees C the proportion of sample C is 0.3571529 
Between 340 and 390 degrees C the proportion of sample C is 0.2355014 
Between 390 and 495 degrees C the proportion of sample C is 0.2936209 
Between 495 and 791 degrees C the proportion of sample C is 0.07359725 
Currently analysing dataframe 
Between 0 and 141.5 degrees C the proportion of sample C is 0.002647777 
Between 141.5 and 246.5 degrees C the proportion of sample C is 0.07616599 
Between 246.5 and 290 degrees C the proportion of sample C is 0.1643875 
Between 290 and 364 degrees C the proportion of sample C is 0.3792163 
Between 364 and 484 degrees C the proportion of sample C is 0.3074933 
Between 484 and 788 degrees C the proportion of sample C is 0.07006177 
Currently analysing dataframe 
Between 0 and 143 degrees C the proportion of sample C is 0.005167379 
Between 143 and 248 degrees C the proportion of sample C is 0.07075111 
Between 248 and 293 degrees C the proportion of sample C is 0.163502 
Between 293 and 367 degrees C the proportion of sample C is 0.3797734 
Between 367 and 487 degrees C the proportion of sample C is 0.3038745 
Between 487 and 792 degrees C the proportion of sample C is 0.07718191 

LS0tCnRpdGxlOiAiU2llcnJhIE5ldmFkYSBGcmFjdGlvbiBBbmFseXNpcyIKYXV0aG9yOiBKLiBCZWVtLU1pbGxlcgpkYXRlOiBcdGV4dGl0e1x0b2RheX0Kb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6CiAgICBkZl9wcmludDogcGFnZWQKICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6ICcyJwogIHBkZl9kb2N1bWVudDoKICAgIGxhdGV4X2VuZ2luZTogeGVsYXRleAogICAgdG9jOiB5ZXMKICAgIHRvY19kZXB0aDogMwogIGh0bWxfbm90ZWJvb2s6CiAgICBjc3M6ICJjdXN0b20uY3NzIgogICAgdG9jOiB5ZXMKICAgIHRvY19kZXB0aDogMgpoZWFkZXJfaW5jbHVkZXM6Ci0gXHVzZXBhY2thZ2VbdXRmOF17aW5wdXRlbmN9Ci0gXHVzZXBhY2thZ2V7ZmxvYXR9Ci0tLQoKYGBge3IgZ2xvYmFsX29wdGlvbnMsIGluY2x1ZGUgPSBGQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICBmaWcuYWxpZ24gPSAnY2VudGVyJywgZGV2ID0gYygnY2Fpcm9fcGRmJywgJ3BuZycpLCBmaWcud2lkdGggPSA2LjUsCiAgICAgICAgICAgICAgICAgICAgICBmaWcuaGVpZ2h0ID0gMy41KQpvcHRpb25zKHNjaXBlbiA9IDUpCiMgbG9hZCBwYWdlIGJyZWFrcyBmeApzb3VyY2UoIi4vdXRpbGl0aWVzL3BhZ2VfYnJlYWtfUm1kLlIiKQpgYGAKCmBgYHtyIHNldHVwLCBpbmNsdWRlID0gRkFMU0V9CmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShkcGx5cikKbGlicmFyeSh0aWR5cikKbGlicmFyeShTb2lsUikKbGlicmFyeShvcGVueGxzeCkKbGlicmFyeShJU1JhRCkKbGlicmFyeShsbWU0KQpsaWJyYXJ5KGxtZXJUZXN0KQpsaWJyYXJ5KGVtbWVhbnMpCmxpYnJhcnkoZ3QpCmxpYnJhcnkoc2NhbGVzKQpsaWJyYXJ5KEdTSUYpCmxpYnJhcnkoYXFwKQpgYGAKCmBgYHtyIGxvYWQgcmF3LWRhdGEtaW5nZXN0IGZ4fQpzb3VyY2UoIi4vdXRpbGl0aWVzL2plbmFfYW1zX2luZ2VzdC5SIikKc291cmNlKCIuL3V0aWxpdGllcy9qZW5hX2lzb19pbmdlc3QuUiIpCnNvdXJjZSgiLi91dGlsaXRpZXMvamVuYV9lbG1faW5nZXN0LlIiKQpgYGAKCmBgYHtyIHBsb3QtZnVuc30KIyBjb2xvciBwYWxldHRlcyBmb3IgRUNPICYgUE0Kd2FybSA8LSAiI0JGODEyRCIKY29vbCA8LSAiIzgwQ0RDMSIKY29sZCA8LSAiIzAxNjY1RSIKZ3Jhbml0ZSA8LSAiIzlkYWJhOSIKYW5kZXNpdGUgPC0gIiMzODJkYmYiCmJhc2FsdCA8LSAiI2JmMzgyZCIKbWluQyA8LSAiIzliMDAzZiIKZlBPTSA8LSAiIzNmOWIwMCIKb1BPTSA8LSAiIzAwNDdhZiIKYGBgCgojIExvYWQgZGF0YQojIyBJbnRlcm5hbCAKIyMjIENOCiMjIyMgUmVhZCByYXcKCmBgYHtyIGxvYWQtY24tZGF0fQojIDIwMDEgJiAyMDE5IGRlbnNpdHkgZnJhY3Rpb24gZGF0YQplbG1fcmVzdWx0c19kaXIgPC0gbGlzdC5maWxlcygiLi4vZGF0YS9yYXciLCBwYXR0ZXJuID0gImVsbV9qZW5hX3Jlc3VsdHMiLCBmdWxsLm5hbWVzID0gVFJVRSkKZWxtX3Jlc3VsdHNfbHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhlbG1fcmVzdWx0c19kaXIpLCBmdW5jdGlvbihpKSB7CiAgaWYgKGdyZXBsKCJlbG1famVuYV9yZXN1bHRzLXNvaWwiLCBlbG1fcmVzdWx0c19kaXJbaV0pKSB7CiAgICB0ZW1wbGF0ZV9maWxlIDwtICIuLi9kYXRhL3Jhdy9lbG1famVuYV90ZW1wbGF0ZS9lbG1famVuYV90ZW1wbGF0ZTIueGxzIgogIH0gZWxzZSB7CiAgICB0ZW1wbGF0ZV9maWxlIDwtICIuLi9kYXRhL3Jhdy9lbG1famVuYV90ZW1wbGF0ZS9lbG1famVuYV90ZW1wbGF0ZS54bHMiCiAgfQogIHJlYWRfamVuYV9lbG1fcmVzdWx0cyhlbG1fcmVzdWx0c19kaXJbaV0sIHRlbXBsYXRlX2ZpbGUgPSB0ZW1wbGF0ZV9maWxlKQp9KQpuYW1lcyhlbG1fcmVzdWx0c19scykgPC0gbGlzdC5maWxlcygiLi4vZGF0YS9yYXciLCBwYXR0ZXJuID0gImVsbV9qZW5hX3Jlc3VsdHMiKQoKIyBzZXBhcmF0ZSBidWxrQyBmcm9tIGZyY0MKZWxtX3Jlc3VsdHNfYmxrQ19scyA8LSBlbG1fcmVzdWx0c19sc1t3aGljaChncmVwbCgiZWxtX2plbmFfcmVzdWx0cy1zb2lsIiwgbmFtZXMoZWxtX3Jlc3VsdHNfbHMpKSldCmVsbV9yZXN1bHRzX2ZyY0NfbHMgPC0gZWxtX3Jlc3VsdHNfbHNbd2hpY2goZ3JlcGwoImVsbV9qZW5hX3Jlc3VsdHMtZnJjIiwgbmFtZXMoZWxtX3Jlc3VsdHNfbHMpKSldCgojIGV4dHJhY3QgYnVsayBDIGFuZCBzdW1tYXJpemUKc3JhLmJsay4yMDE5LmRmIDwtIGJpbmRfcm93cyh1bmxpc3QoZWxtX3Jlc3VsdHNfYmxrQ19scywgcmVjdXJzaXZlID0gRkFMU0UpKSAlPiUKICBtdXRhdGUoUE1lY28gPSBzYXBwbHkoc3Ryc3BsaXQoSUQsICJfIiksICJbIiwgMiksCiAgICAgICAgIGRlcHRoID0gc2FwcGx5KHN0cnNwbGl0KElELCAiXyIpLCAiWyIsIDQpKQpzcmEuYmxrLjIwMTkuc3VtLmRmIDwtIHNyYS5ibGsuMjAxOS5kZiAlPiUKICBncm91cF9ieShQTWVjbywgZGVwdGgpICU+JQogIHN1bW1hcml6ZShhY3Jvc3MoYyhDLCBOKSwgLmZucyA9IGxpc3QobWVhbiA9IG1lYW4sIHNkID0gc2QpKSwgLmdyb3VwcyA9ICJkcm9wIikgJT4lCiAgbXV0YXRlKElEMiA9IHBhc3RlKFBNZWNvLCBkZXB0aCwgc2VwID0gIl8iKSkKYGBgCgojIyMjIFRlbXBsYXRlcwoKYGBge3IgY3JlYXRlLWZyYy1kYXRhLXRlbXBsYXRlc30KIyMgQ3JlYXRlIHRlbXBsYXRlIGZvciBjb21wb3NpdGUgc29pbCBkYXRhIChlLmcuIGRlbnNpdHkgZnJhY3Rpb25zKQojIEJhc2ljIGxpc3QgdGVtcGxhdGUKUE1lY28ubHMgPC0gdmVjdG9yKG1vZGUgPSAibGlzdCIsIGxlbmd0aCA9IDkpCm5hbWVzKFBNZWNvLmxzKSA8LSBsZXZlbHMoaW50ZXJhY3Rpb24oYygiQU4iLCAiQlMiLCAiR1IiKSwgYygicHAiLCAid2YiLCAicmYiKSwgc2VwID0gIiIpKQoKIyBsaXN0IG9mIGRlcHRocyBmb3IgMjAwMSBzYW1wbGVzCmRlcHRoX2JvdF8yMDAxLmxzIDwtIGxpc3QoQU5wcCA9IGMoNiwgMTMsIDMzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBBTndmID0gYygxMSwgMzUpLAogICAgICAgICAgICAgICAgICAgICAgICAgIEFOcmYgPSBjKDExLCAzMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgQlNwcCA9IGMoNywgMTgsIDI4KSwKICAgICAgICAgICAgICAgICAgICAgICAgICBCU3dmID0gYygxMCwgMTkpLAogICAgICAgICAgICAgICAgICAgICAgICAgIEJTcmYgPSBjKDgsIDE1LCAzMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgR1JwcCA9IGMoNywgMTUsIDI3KSwKICAgICAgICAgICAgICAgICAgICAgICAgICBHUndmID0gYyg0LCAxMywgMjgpLAogICAgICAgICAgICAgICAgICAgICAgICAgIEdScmYgPSBjKDgsIDI3KSkKCiMgbGlzdCBvZiBkZXB0aHMgZm9yIDIwMTkgc2FtcGxlcwpkZXB0aF9ib3RfMjAxOS5scyA8LSBsYXBwbHkoUE1lY28ubHMsIGZ1bmN0aW9uKGRmKSBzZXEoMTAsIDMwLCAxMCkpCgojIHRlbXBsYXRlIGZ4CnNyYS5mcmMudGVtcGxhdGUuZnggPC0gZnVuY3Rpb24oZGVwdGhfYm90LCB5ZWFyKSB7CiAgbm1zIDwtIG5hbWVzKGRlcHRoX2JvdCkKICBscyA8LSBsYXBwbHkoc2VxX2Fsb25nKGRlcHRoX2JvdCksIGZ1bmN0aW9uKGkpIHsKICAgIG4gPC0gbGVuZ3RoKGRlcHRoX2JvdFtbaV1dKQogICAgZGYgPC0gZGF0YS5mcmFtZSh5ZWFyID0gcmVwKHllYXIsIG4pLAogICAgICAgICAgICAgICAgICAgICBQTSA9IHJlcChzdWJzdHIobm1zW2ldLCAxLCAyKSwgbiksIAogICAgICAgICAgICAgICAgICAgICBFQ08gPSByZXAoc3Vic3RyKG5tc1tpXSwgMywgNCksIG4pLAogICAgICAgICAgICAgICAgICAgICBseXJfYm90ID0gZGVwdGhfYm90W1tpXV0pCiAgICBkZiRseXJfdG9wIDwtIHNhcHBseShzZXFfYWxvbmcoZGVwdGhfYm90W1tpXV0pLCBmdW5jdGlvbihqKSB7CiAgICAgIGlmIChqID09IDEpIHsKICAgICAgICAwCiAgICAgIH0gZWxzZSB7CiAgICAgICAgZGVwdGhfYm90W1tpXV1baiAtIDFdCiAgICAgIH0KICAgIH0pCiAgICBkZiRJRCA8LSBwYXN0ZTAoZGYkUE0sIGRmJEVDTywgIl9jb21wXyIsIGRmJHllYXIsICJfIiwgZGYkbHlyX3RvcCwgIi0iLCBkZiRseXJfYm90KQogICAgcmV0dXJuKGRmKQogIH0pCiAgbmFtZXMobHMpIDwtIG5tcwogIGZyYy5scyA8LSByZXBsaWNhdGUoMywgbHMsIEZBTFNFKQogIG5hbWVzKGZyYy5scykgPC0gYygiRlBPTSIsICJPUE9NIiwgIk1PTSIpCiAgcmV0dXJuKGZyYy5scykKfQoKIyAyMDAxCnNyYS5mcmMudG1wLjIwMDEubHMgPC0gc3JhLmZyYy50ZW1wbGF0ZS5meChkZXB0aF9ib3RfMjAwMS5scywgMjAwMSkKCiMgMjAxOQpzcmEuZnJjLnRtcC4yMDE5LmxzIDwtIHNyYS5mcmMudGVtcGxhdGUuZngoZGVwdGhfYm90XzIwMTkubHMsIDIwMTkpCmBgYAoKIyMjIyBNZXJnZSByYXcgdy8gdGVtcGxhdGUKCmBgYHtyIGZpbGwtZnJjLWNufQojIGRlZmluZSBleHRyYWN0aW9uIGZ1bmN0aW9uCmZpbGwuY24uZnggPC0gZnVuY3Rpb24odGVtcGxhdGUsIGVsbV9yZXN1bHRzX2xzLCB5ZWFyLCB0eXBlKSB7CiAgCiAgIyBpbnRlcm5hbCBmeCBmb3IgZXh0cmFjdGluZyBjbiBkYXRhIGFuZCBhdmVyYWdpbmcgYW5hbHl0aWNhbCBkdXBsaWNhdGVzIGFzIG5lZWRlZAogIGV4dHJhY3QuZWxtLmZ4IDwtIGZ1bmN0aW9uKGxzKSB7CiAgICBsYXBwbHkobHMsIGZ1bmN0aW9uKHgpIHsKICAgICAgaXggPC0gZ3JlcCh4JElELCBjbi5kZiRJRCkKICAgICAgaWYgKGxlbmd0aChpeCA+IDEpKSB7CiAgICAgICAgeCA8LSBjYmluZCh4LAogICAgICAgICAgICAgICAgICAgQyA9IG1lYW4oY24uZGZbaXgsICJDIl0pLCAKICAgICAgICAgICAgICAgICAgIE4gPSBtZWFuKGNuLmRmW2l4LCAiTiJdKSwgCiAgICAgICAgICAgICAgICAgICByb3cubmFtZXMgPSBOVUxMKQogICAgICB9IGVsc2UgaWYgKGxlbmd0aChpeCkgPT0gMSkgewogICAgICAgIHggPC0gY2JpbmQoeCwgY24uZGZbaXgsIGMoIkMiLCAiTiIpXSwgcm93Lm5hbWVzID0gTlVMTCkKICAgICAgfQogICAgICByZXR1cm4oeCkKICAgIH0pICAgIAogIH0KICAKICAjIHNlbGVjdCBDTiBkYXRhIGJ5IHllYXIKICBjbi5scyA8LSB1bmxpc3QoCiAgICBsYXBwbHkoZ3JlcChwYXN0ZTAodHlwZSwgc3Vic3RyKHllYXIsIDMsIDQpKSwgbmFtZXMoZWxtX3Jlc3VsdHNfbHMpKSwgZnVuY3Rpb24oaSkgewogICAgICBlbG1fcmVzdWx0c19sc1tbaV1dCiAgICB9KSwgcmVjdXJzaXZlID0gRkFMU0UpCiAgCiAgIyBzdG9yZSBmcmFjdGlvbiBuYW1lcwogIG5tcyA8LSBuYW1lcyh0ZW1wbGF0ZSkKICAKICAjIGxvb3AgZm9yIHJ1bm5pbmcgZXh0cmFjdGlvbgogIGZvcihpIGluIHNlcV9hbG9uZyhubXMpKSB7CiAgICAKICAgICMgbWFrZSBkYXRhIGZyYW1lIG9mIGRhdGEgZm9yIHRhcmdldCBmcmFjdGlvbiBhbmQgeWVhcgogICAgY24uZGYgPC0gYmluZF9yb3dzKGNuLmxzW2dyZXAobmFtZXModGVtcGxhdGUpW2ldLCBuYW1lcyhjbi5scykpXSkKICAgIAogICAgIyBjaGVjayBpZiB0YXJnZXQgZnJhY3Rpb24gZGF0YSBleGlzdCBhbmQgcnVuIGV4dHJhY3Rpb24gZnVuY3Rpb24gaWYgc28KICAgIGlmIChucm93KGNuLmRmKSAhPSAwKSB7CiAgICAgIAogICAgICAjIGV4dHJhY3QgZGF0YSBmb3IgZWFjaCBmcmFjdGlvbgogICAgICB0ZW1wbGF0ZVtbaV1dIDwtIGxhcHBseSh0ZW1wbGF0ZVtbaV1dLCBmdW5jdGlvbihkZikgewogICAgICAgIGJpbmRfcm93cyhleHRyYWN0LmVsbS5meChzcGxpdChkZiwgZGYkSUQpKSkKICAgICAgfSkKICAgIH0KICB9CiAgCiAgIyByZXR1cm4gb3V0cHV0IGxpc3QgbmFtZWQgYnkgdGFyZ2V0IGZyYWN0aW9uCiAgbmFtZXModGVtcGxhdGUpIDwtIG5tcwogIHJldHVybih0ZW1wbGF0ZSkgCn0KCiMgZXh0cmFjdCBsYXllciBkYXRhIGJ5IHllYXIKc3JhLmZyYy4yMDAxLmxzIDwtIGZpbGwuY24uZngoc3JhLmZyYy50bXAuMjAwMS5scywgZWxtX3Jlc3VsdHNfZnJjQ19scywgMjAwMSwgImZyYyIpCnNyYS5mcmMuMjAxOS5scyA8LSBmaWxsLmNuLmZ4KHNyYS5mcmMudG1wLjIwMTkubHMsIGVsbV9yZXN1bHRzX2ZyY0NfbHMsIDIwMTksICJmcmMiKQpgYGAKCiMjIyAxNEMKCmBgYHtyIGxvYWQtMTRjLWRhdH0KIyByZWFkIGFtcyBkaXIKYW1zX2plbmFfcmVzdWx0c19kaXJzIDwtIGxpc3QuZmlsZXMoIi4uL2RhdGEvcmF3IiwgcGF0dGVybiA9ICJhbXNfamVuYV9yZXN1bHRzIiwgZnVsbC5uYW1lcyA9IFRSVUUpCgojIGxpc3QgZmlsZXMgdy8gbmV3IGFuZCBvbGQgdGVtcGxhdGVzIGJ5IGRhdGUKZGF0ZXMgPC0gc2FwcGx5KGxhcHBseShzdHJzcGxpdChhbXNfamVuYV9yZXN1bHRzX2RpcnMsICJfKD8hLipfKSIsIHBlcmwgPSBUUlVFKSwgIltbIiwgMiksIGFzLkRhdGUpCmFtc19qZW5hX3Jlc3VsdHNfZGlyc19uZXcgPC0gYW1zX2plbmFfcmVzdWx0c19kaXJzW3doaWNoKGRhdGVzID4gYXMuRGF0ZSgiMjAyMi0wMS0yMyIpKV0KYW1zX2plbmFfcmVzdWx0c19kaXJzX29sZCA8LSBhbXNfamVuYV9yZXN1bHRzX2RpcnNbd2hpY2goZGF0ZXMgPCBhcy5EYXRlKCIyMDIyLTAxLTIzIikpXQoKIyBuZXcgdGVtcGxhdGUKbmV3X3RlbXBsYXRlIDwtICIuLi9kYXRhL3Jhdy9hbXNfamVuYV90ZW1wbGF0ZV8yMDIyLTAxLTI0L2Ftc19qZW5hX3RlbXBsYXRlLnhsc3giCgojIHJlYWQgaW4gZGF0YQphbXNfcmVzdWx0c19scyA8LSBjKAogIGxhcHBseShzZXFfYWxvbmcoYW1zX2plbmFfcmVzdWx0c19kaXJzX25ldyksIGZ1bmN0aW9uKGkpIHsKICAgIHJlYWRfamVuYV9hbXNfcmVzdWx0cyhhbXNfamVuYV9yZXN1bHRzX2RpcnNfbmV3W2ldLCAKICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9maWxlID0gbmV3X3RlbXBsYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gMzEpCiAgfSksCiAgbGFwcGx5KHNlcV9hbG9uZyhhbXNfamVuYV9yZXN1bHRzX2RpcnNfb2xkKSwgZnVuY3Rpb24oaSkgewogICAgcmVhZF9qZW5hX2Ftc19yZXN1bHRzKGFtc19qZW5hX3Jlc3VsdHNfZGlyc19vbGRbaV0pCiAgfSkpCm5hbWVzKGFtc19yZXN1bHRzX2xzKSA8LSB1bmxpc3QoCiAgYyhsYXBwbHkoc3Ryc3BsaXQoYW1zX2plbmFfcmVzdWx0c19kaXJzX25ldywgIi8oPyEuKi8pIiwgcGVybCA9IFRSVUUpLCAiW1siLCAyKSwKICAgIGxhcHBseShzdHJzcGxpdChhbXNfamVuYV9yZXN1bHRzX2RpcnNfb2xkLCAiLyg/IS4qLykiLCBwZXJsID0gVFJVRSksICJbWyIsIDIpKSkKCiMgcmVtb3ZlIGZsYXdlZCBBTnJmIHNhbXBsZXMKQU5yZi5ybSA8LSBjKCIxMF9BTnJmX2NvbXBfMjAxOV8wLTEwX01PTSIsIAogICAgICAgICAgICAgIjExX0FOcmZfY29tcF8yMDE5XzEwLTIwX01PTV9hIiwKICAgICAgICAgICAgICIxMl9BTnJmX2NvbXBfMjAxOV8yMC0zMF9NT00iKQppZiAoYW55KCFpcy5uYShtYXRjaChBTnJmLnJtLCBhbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1mcmMxOS1NT01fMjAyMS0wNi0yNmAkYEJlZW0tTWlsbGVyXzI0Lnhsc3hgJFByb2JlKSkpKSB7CiAgYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtZnJjMTktTU9NXzIwMjEtMDYtMjZgJGBCZWVtLU1pbGxlcl8yNC54bHN4YCA8LSBhbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1mcmMxOS1NT01fMjAyMS0wNi0yNmAkYEJlZW0tTWlsbGVyXzI0Lnhsc3hgWy1tYXRjaChBTnJmLnJtLCBhbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1mcmMxOS1NT01fMjAyMS0wNi0yNmAkYEJlZW0tTWlsbGVyXzI0Lnhsc3hgJFByb2JlKSwgXQp9CgojICMgc2VwYXJhdGUgcmVkb3MKIyBhbXNfcmVzdWx0c19yZWRvX2xzIDwtIGxhcHBseShhbXNfcmVzdWx0c19scywgZnVuY3Rpb24obHMpCiMgICAgIEZpbHRlcihOZWdhdGUoaXMubnVsbCksIGxhcHBseShscywgZnVuY3Rpb24oZGYpIHsKIyAgICAgICBkZl9SIDwtIGRmW2dyZXAoIl9SIiwgZGYkUHJvYmUpLCBdIAojICAgICAgIGlmIChucm93KGRmX1IpICE9IDApIHsKIyAgICAgICAgIGRmX1IKIyAgICAgICB9CiMgICAgIH0pKSkKIyBhbXNfcmVzdWx0c19yZWRvX2RmIDwtIGJpbmRfcm93cyhGaWx0ZXIoCiMgICAgIE5lZ2F0ZShpcy5udWxsKSwgbGFwcGx5KGFtc19yZXN1bHRzX3JlZG9fbHMsIGZ1bmN0aW9uKGxzKSB7CiMgICAgICAgaWYgKGxlbmd0aChscykgPiAwKSB7CiMgICAgICAgICBiaW5kX3Jvd3MobHMpCiMgICAgICAgfQojICAgICB9KSkpICU+JQojICAgZmlsdGVyKCFpcy5uYShGMTRDKSkKYGBgCgojIyMgTWFzcwoKYGBge3IgbG9hZC1mcmMtbWFzcy1kYXRhfQojIGxvYWQgcmF3IGRhdGEKc3JhLmZyYy5tc3MucmF3IDwtIHJlYWRfZXhjZWwoIi4uL2RhdGEvcmF3L2xhYl9qZW5hX3Jlc3VsdHMtZnJjMTktZnJjMDFfMjAyMS0wNS0wNS9EaWNodGVmcmFrdGlvbmllcnVuZ19KZWZmXzIwMjAueGxzIiwgc2hlZXQgPSAiVGFiZWxsZTEiKQoKIyBmaWx0ZXIgYW5kIHJlZHVjZQpzcmEuZnJjLm1zcy5kZiA8LSBzcmEuZnJjLm1zcy5yYXcgJT4lCiAgZmlsdGVyKGlzLm5hKFNhbXBsZVJlZG9uZSkpICU+JQogIHNlbGVjdChQcm9iZSwgYEVpbndhYWdlIChnKWAsIEZyYWt0aW9uLCBgTEYgKGcpYCwgYEhGIChnKWApICU+JQogIG11dGF0ZSh5aWVsZCA9IGlmZWxzZShpcy5uYShgTEYgKGcpYCksIGBIRiAoZylgLCBgTEYgKGcpYCkpICU+JQogIHNlbGVjdCgtYyhgTEYgKGcpYCwgYEhGIChnKWApKSAlPiUKICByZW5hbWUod3RfZyA9IGBFaW53YWFnZSAoZylgKQoKIyAxKSBjb21iaW5lIG11bHRpcGxlIGZsYXNrIHNhbXBsZXMgZm9yIGluZGl2aWR1YWwgZmxhc2tzCiMgMikgZmlsbCBpbiBtaXNzaW5nIG9QT00gZGF0YSBmcm9tIDIwMTkgR1JyZiBzaXRlcwojIE5COiBhbG1vc3Qgbm8gbG9zcyBmb3IgMjAwMSBzaXRlcywgc28gc2VlbXMganVzdGlmaWVkIHRvIGFzc3VtZSBub25lIGluIDIwMTkKc3JhLmZyYy5tc3Mud2lkZS5kZiA8LSBiaW5kX3Jvd3MoCiAgbGFwcGx5KHNwbGl0KHNyYS5mcmMubXNzLmRmLCBzcmEuZnJjLm1zcy5kZiRQcm9iZSksIGZ1bmN0aW9uKGRmKSB7CiAgICBpZiAobnJvdyhkZikgPiAzKSB7CiAgICAgIGRmIDwtIGRmICU+JSAKICAgICAgICBncm91cF9ieShGcmFrdGlvbiwgUHJvYmUsIHd0X2cpICU+JQogICAgICAgIHN1bW1hcml6ZSh5aWVsZCA9IHN1bSh5aWVsZCksIC5ncm91cHMgPSAiZHJvcCIpCiAgICB9CiAgICByZXR1cm4oZGYpCiAgfSkpICU+JQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBGcmFrdGlvbiwgdmFsdWVzX2Zyb20gPSB5aWVsZCkgJT4lCiAgcmVuYW1lKEZQT00gPSBmUE9NLCBPUE9NID0gb1BPTSwgTU9NID0gSEYpICU+JQogIG11dGF0ZShPUE9NID0gaWZlbHNlKGlzLm5hKE9QT00pLCB3dF9nIC0gRlBPTSAtIE1PTSwgT1BPTSkpCgojIHN1bSBtYXNzCnNyYS5mcmMubXNzLndpZGUuZGYkbWFzc19zdW0gPC0gcm93U3VtcyhzcmEuZnJjLm1zcy53aWRlLmRmWyAsIGMoIkZQT00iLCAiT1BPTSIsICJNT00iKV0pCgojIHBpdm90IGxvbmdlciBhbmQgY2FsY3VsYXRlIG1hc3MgcGN0CnNyYS5mcmMubXNzLmxvbmcuZGYgPC0gc3JhLmZyYy5tc3Mud2lkZS5kZiAlPiUKICBwaXZvdF9sb25nZXIoY29scyA9IGMoIkZQT00iLCAiT1BPTSIsICJNT00iKSwgbmFtZXNfdG8gPSAiZnJjIiwgdmFsdWVzX3RvID0gIm1hc3NfZyIpICU+JQogIG11dGF0ZShtYXNzX3BjdCA9IHJvdW5kKG1hc3NfZyAvIG1hc3Nfc3VtICogMTAwLCAxKSwKICAgICAgICAgZGVwdGggPSBzYXBwbHkoc3Ryc3BsaXQoUHJvYmUsICJfKD8hLipfKSIsIHBlcmwgPSBUUlVFKSwgIltbIiwgMiksCiAgICAgICAgIGx5cl90b3AgPSBhcy5udW1lcmljKHNhcHBseShzdHJzcGxpdChkZXB0aCwgIlstXSIpLCAiW1siLCAxKSksCiAgICAgICAgIGx5cl9ib3QgPSBhcy5udW1lcmljKHNhcHBseShzdHJzcGxpdChkZXB0aCwgIlstXSIpLCAiW1siLCAyKSksCiAgICAgICAgIHllYXIgPSBhcy5udW1lcmljKHNhcHBseShzdHJzcGxpdChQcm9iZSwgIl8iKSwgIltbIiwgMykpLAogICAgICAgICBQTWVjbyA9IHNhcHBseShzdHJzcGxpdChQcm9iZSwgIl8iKSwgIltbIiwgMSkpICU+JQogIGFycmFuZ2UobHlyX2JvdCkKCiMgc3BsaXQgYnkgeWVhcgpzcmEuZnJjLm1zcy5sb25nLjAxLmRmIDwtIHNyYS5mcmMubXNzLmxvbmcuZGZbc3JhLmZyYy5tc3MubG9uZy5kZiR5ZWFyID09IDIwMDEsIF0Kc3JhLmZyYy5tc3MubG9uZy4xOS5kZiA8LSBzcmEuZnJjLm1zcy5sb25nLmRmW3NyYS5mcmMubXNzLmxvbmcuZGYkeWVhciA9PSAyMDE5LCBdCmBgYAoKCmBgYHtyIHBsb3QtZnJjLW1hc3MtbG9zc2VzfQojIGNhbGMgbG9zcywgZHJvcCBzYW1wbGVzIHdpdGhvdXQgYWxsIHdlaWdodHMKc3JhLmZyYy5tc3MubHNzLmRmIDwtIHNyYS5mcmMubXNzLndpZGUuZGYKc3JhLmZyYy5tc3MubHNzLmRmJHN1bSA8LSByb3dTdW1zKHNyYS5mcmMubXNzLmxzcy5kZlsgLCBjKCJGUE9NIiwgIk9QT00iLCAiTU9NIildKQpzcmEuZnJjLm1zcy5sc3MuZGYkbG9zcyA8LSBzcmEuZnJjLm1zcy5sc3MuZGYkd3RfZyAtIHNyYS5mcmMubXNzLmxzcy5kZiRzdW0Kc3JhLmZyYy5tc3MubHNzLmRmJGxvc3NfcGN0IDwtIChzcmEuZnJjLm1zcy5sc3MuZGYkbG9zcyAvIHNyYS5mcmMubXNzLmxzcy5kZiR3dF9nKSAqIDEwMAogIAojIHN1bW1hcml6ZSBsb3NzZXMgYnkgUE0sIEVDTwpzcmEuZnJjLm1zcy5sc3MuZGYkUE0gPC0gc3Vic3RyKHNyYS5mcmMubXNzLmxzcy5kZiRQcm9iZSwgMSwgMikKc3JhLmZyYy5tc3MubHNzLmRmJEVDTyA8LSBmYWN0b3Ioc3Vic3RyKHNyYS5mcmMubXNzLmxzcy5kZiRQcm9iZSwgMywgNCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJwcCIsICJ3ZiIsICJyZiIpKQpzcmEuZnJjLm1zcy5sc3MuZGYkeWVhciA8LSBhcy5udW1lcmljKHN1YnN0cihzcmEuZnJjLm1zcy5sc3MuZGYkUHJvYmUsIDExLCAxNCkpCnNyYS5mcmMubXNzLmxzcy5kZiRkZXB0aCA8LSBzYXBwbHkoCiAgc3Ryc3BsaXQoc3JhLmZyYy5tc3MubHNzLmRmJFByb2JlLCAiXyg/IS4qXykiLCBwZXJsID0gVFJVRSksIAogICJbWyIsIDIpCnNyYS5mcmMubXNzLmxzcy5kZiRseXJfYm90IDwtIGFzLm51bWVyaWMoaWZlbHNlKG5jaGFyKHNyYS5mcmMubXNzLmxzcy5kZiRkZXB0aCkgPT0gMywgc3Vic3RyKHNyYS5mcmMubXNzLmxzcy5kZiRkZXB0aCwgMywgMyksIGlmZWxzZShuY2hhcihzcmEuZnJjLm1zcy5sc3MuZGYkZGVwdGgpID09IDQsIHN1YnN0cihzcmEuZnJjLm1zcy5sc3MuZGYkZGVwdGgsIDMsIDQpLCBzdWJzdHIoc3JhLmZyYy5tc3MubHNzLmRmJGRlcHRoLCA0LCA1KSkpKQoKIyMgc3VtbWFyaXplCiMgc3VtbWFyeShsbShsb3NzX3BjdCB+IFBNICsgRUNPICsgeWVhciArIGx5cl9ib3QsIAojICAgICAgICAgICAgc3JhLmZyYy5tc3MubHNzLmRmWy13aGljaChzcmEuZnJjLm1zcy5sc3MuZGYkUHJvYmUgPT0gIkJTcHBfY29tcF8yMDAxXzE4LTI4IiksIF0pKQpzdW1tYXJ5KGxtKGxvc3NfcGN0IH4gUE0gKyBFQ08sIAogICAgICAgICAgIHNyYS5mcmMubXNzLmxzcy5kZlstd2hpY2goc3JhLmZyYy5tc3MubHNzLmRmJFByb2JlID09ICJCU3BwX2NvbXBfMjAwMV8xOC0yOCIpLCBdKSkKCiMgcGxvdApzcmEuZnJjLm1zcy5sc3MuZGYgJT4lCiAgcmVuYW1lKGBNYXNzIGxvc3MgKCUpYCA9IGxvc3NfcGN0KSAlPiUKICBtdXRhdGUoZWNvID0gZmFjdG9yKGlmZWxzZShFQ08gPT0gInBwIiwgIndhcm0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShFQ08gPT0gIndmIiwgImNvb2wiLCAiY29sZCIpKSwKICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIndhcm0iLCAiY29vbCIsICJjb2xkIikpLAogICAgICAgICBwbSA9IGlmZWxzZShQTSA9PSAiQU4iLCAiYW5kZXNpdGUiLAogICAgICAgICAgICAgICAgICAgICBpZmVsc2UoUE0gPT0gIkJTIiwgImJhc2FsdCIsICJncmFuaXRlIikpKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKEVDTywgYE1hc3MgbG9zcyAoJSlgLCBjb2xvciA9IHBtLCBzaGFwZSA9IGVjbykpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBjb2xvciA9ICJibGFjayIpICsKICBnZW9tX3BvaW50KHNpemUgPSAzKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoImFuZGVzaXRlIiA9IGFuZGVzaXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYXNhbHQiID0gYmFzYWx0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJncmFuaXRlIiA9IGdyYW5pdGUpKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoIndhcm0iID0gMTUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvb2wiID0gMTcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbGQiID0gMTYpKSArCiAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyh5ZWFyKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCkpCmBgYAoKSW50ZXJlc3RpbmdseSwgaXQgYXBwZWFycyB0aGF0IEFOIHNvaWxzIGhhdmUgcHJvcG9ydGlvbmFsbHkgTEVTUyBtaW5DIGJ5IG1hc3MgdGhhbiBkbyBHUiBvciBCUyBzb2lscywgc2lnbmlmaWNhbnRseSBzbyBhdCBkZXB0aC4gV2h5IHdvdWxkIHRoaXMgYmU/IFBvc3NpYmx5IGJlY2F1c2UgQU4gc29pbHMgaGF2ZSBoaWdoZXIgbG9zc2VzIChET0MpIGR1cmluZyBmcmFjdGlvbmF0aW9uPwoKIyMgRXh0ZXJuYWwgZGF0YQojIyMgQXRtb3NwaGVyZQoKYGBge3IgYXRtMTRjLWRhdGF9CkRhdG0gPC0gcmJpbmQoZ3JhdmVuLCBmdXR1cmUxNEMpCmF0bS4xNGMgPC0gZGF0YS5mcmFtZSh5ZWFyID0gRGF0bVtEYXRtJERhdGUgPiAyMDAwLCAiRGF0ZSJdLAogICAgICAgICAgICAgICAgICAgICAgZDE0YyA9IERhdG1bRGF0bSREYXRlID4gMjAwMCwgIk5IYzE0Il0sCiAgICAgICAgICAgICAgICAgICAgICBUeXBlID0gImF0bW9zcGhlcmUiKQpgYGAKCiMjIyBmcm9tIEMuIFJhc211c3NlbiAoJzAxIEMsIE47ICcwOSAxNEMsIGZyYyBtYXNzLCBDLCBOKQoKYGBge3IgbG9hZC1yYXMtMDEtMDktZGF0YX0KIyBSYXNtdXNzZW4gMjAwMSBkYXRhCiMjIDIwMDEgc3VtbWFyeSBkYXRhCnNvYy4yMDAxIDwtIGRhdGEuZnJhbWUocmVhZF9leGNlbCgiLi4vZGF0YS9leHRlcm5hbC9zcmFfcmFzX3N1bS9zaWVycmFfZGF0YV9zdW1tYXJ5XzIwMjAueGxzeCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGVldCA9ICIyMDAxX2J1bGtfZGF0YSIpKQoKIyBSYXNtdXNzZW4gMjAwOSBkYXRhCiMjIDIwMDkgZnJhY3Rpb24gQywgTiwgbWFzcyBkYXRhCnNyYS4wOS5mcmMucmF3IDwtIHJlYWRfZXhjZWwoIi4uL2RhdGEvZXh0ZXJuYWwvc3JhX3Jhc19zdW0vc2llcnJhX2RhdGFfc3VtbWFyeV8yMDIwLnhsc3giLCBzaGVldCA9ICIyMDA5X2ZyYWN0aW9uX2RhdGEiKSAlPiUgdHlwZS5jb252ZXJ0KC4sIGFzLmlzID0gVFJVRSkgJT4lIGRhdGEuZnJhbWUKCiMjIDIwMDkgc3VtbWFyeSBkYXRhCnNyYS4wOS5zdW0gPC0gcmVhZF9leGNlbCgiLi4vZGF0YS9leHRlcm5hbC9zcmFfcmFzX3N1bS9zaWVycmFfZGF0YV9zdW1tYXJ5XzIwMjAueGxzeCIsIHNoZWV0ID0gIkRhdGFfU3VtbWFyeV8yMDE4X3BhcGVyIikgJT4lIHR5cGUuY29udmVydCguLCBhcy5pcyA9IFRSVUUpICU+JSBkYXRhLmZyYW1lCgojIyAyMDA5IGJ1bGsgQwpzb2MuMDkuYmxrQy5kZiA8LSByZWFkX2V4Y2VsKCIuLi9kYXRhL2V4dGVybmFsL3NyYV9yYXNfc3VtL3NpZXJyYV9kYXRhX3N1bW1hcnlfMjAyMC54bHN4Iiwgc2hlZXQgPSAiMjAwOV9idWxrX2RhdGEiKSAlPiUgdHlwZS5jb252ZXJ0KC4sIGFzLmlzID0gVFJVRSkgJT4lIGRhdGEuZnJhbWUKCiMgUmFzbXVzc2VuIDIwMDkgMTRDIGRhdGE6IElTUmFECiMjIHJlYWQgSVNSYUQgZngKc3JhLjA5LmlzcmFkIDwtIElTUmFELnJlYWQuZW50cnkoIi4uL2RhdGEvZXh0ZXJuYWwvc3JhX3Jhc19JU1JhRC9SYXNtdXNzZW5fMjAxOC54bHN4IikKCiMgZ2V0IGx5ciBkYXRhCnNyYS4wOS5seXIuZGYgPC0gc3JhLjA5LmlzcmFkJFJhc211c3Nlbl8yMDE4JGxheWVyCgojIGdldCBmcmMgZGF0YQpzcmEuMDkuZnJjLmRmIDwtIG1lcmdlKAogIHNyYS4wOS5pc3JhZCRSYXNtdXNzZW5fMjAxOCRmcmFjdGlvbiwKICBzcmEuMDkuaXNyYWQkUmFzbXVzc2VuXzIwMTgkbGF5ZXJbLCBjKCJwcm9fbmFtZSIsICJseXJfbmFtZSIsICJseXJfYm90IiwgImx5cl90b3AiLCAibHlyX2Nfb3JnIiwgImx5cl9uX3RvdCIsICJseXJfc29jIiwgImx5cl9iZF9zYW1wIiwgImx5cl9vYnNfZGF0ZV95IildLCBieSA9IGMoInByb19uYW1lIiwgImx5cl9uYW1lIikpCgojIyBmaWxsIG1pc3NpbmcgZDE0YyBkYXRhCml4IDwtIHdoaWNoKGlzLm5hKHNyYS4wOS5mcmMuZGYkZnJjXzE0YykgJiAhaXMubmEoc3JhLjA5LmZyYy5kZiRmcmNfZnJhY3Rpb25fbW9kZXJuKSkKc3JhLjA5LmZyYy5kZltpeCwgImZyY18xNGMiXSA8LSBjb252ZXJ0X2ZtX2QxNGMoCiAgZm0gPSBzcmEuMDkuZnJjLmRmW2l4LCAiZnJjX2ZyYWN0aW9uX21vZGVybiJdLCAKICBvYnNfZGF0ZV95ID0gc3JhLjA5LmZyYy5kZltpeCwgImx5cl9vYnNfZGF0ZV95Il0pCgojIyByZXNoYXBlIElTUmFEIGRhdGEgdG8gbWVyZ2Ugd2l0aCBkZW5zLmRmCnNyYS5mcmMuMTRjIDwtIHNyYS4wOS5mcmMuZGYgJT4lCiAgbXV0YXRlKFBNZWNvID0gYXMuY2hhcmFjdGVyKHByb19uYW1lKSwKICAgICAgICAgUE0gPSBzdWJzdHIoUE1lY28sIDEsIDIpLAogICAgICAgICBFQ08gPSBzdWJzdHIoUE1lY28sIDMsIDQpLAogICAgICAgICBwcm9fbmFtZSA9IHBhc3RlMChQTWVjbywgIl8iLCBseXJfb2JzX2RhdGVfeSksCiAgICAgICAgIGZyYyA9IGlmZWxzZShmcmNfcHJvcGVydHkgPT0gImZyZWUgbGlnaHQiLCAiZlBPTSIsIAogICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGZyY19wcm9wZXJ0eSA9PSAiaGVhdnkiLCAibWluQyIsICJvUE9NIikpLAogICAgICAgICBZZWFyID0gMjAwOSkgJT4lICMgbm90ZSB0aGF0IEdSIHNhbXBsZXMgd2VyZSB0ZWNobmljYWxseSBjb2xsZWN0ZWQgaW4gMjAxMC4uLgogIHNlbGVjdChmcmNfZnJhY3Rpb25fbW9kZXJuLCBmcmNfZnJhY3Rpb25fbW9kZXJuX3NpZ21hLCBmcmNfMTRjLCBmcmNfMTRjX3NpZ21hLCBmcmMsIFBNZWNvLCBQTSwgRUNPLCBZZWFyLCBwcm9fbmFtZSwgbHlyX3RvcCwgbHlyX2JvdCwgbHlyX2JkX3NhbXApICU+JSAKICByZW5hbWUoRjE0QyA9IGZyY19mcmFjdGlvbl9tb2Rlcm4sCiAgICAgICAgIGVyciA9IGZyY19mcmFjdGlvbl9tb2Rlcm5fc2lnbWEsCiAgICAgICAgIGZyY18xNGNfZXJyID0gZnJjXzE0Y19zaWdtYSkgCmBgYAoKIyBBbmFseXNpcwojIyBNaXNjLiBmdW5jdGlvbnMKCmBgYHtyIGRlZmluZS1DLXNwbGluZS1meHN9CiMgZGVwdGggc3BsaW5lIGZvciBDIHBlcmNlbnQsIHdoZXJlIGQgPSB2ZWN0b3Igb2YgbGF5ZXIgYm90dG9tIGRlcHRocwpDc3BsaW5lLmZ4IDwtIGZ1bmN0aW9uKGRmLCB2YXIubmFtZSwgZCA9IGMoMTAsIDIwLCAzMCkpIHsKICBiaW5kX3Jvd3MobGFwcGx5KHNwbGl0KGRmLCBkZiRwcm9fbmFtZSksIGZ1bmN0aW9uKHgpIHsKICAgIGRlcHRocyh4KSA8LSBwcm9fbmFtZSB+IGx5cl90b3AgKyBseXJfYm90CiAgICB4Lm1wcyA8LSBtcHNwbGluZSh4LCB2YXIubmFtZSA9IHZhci5uYW1lLCBkID0gdChjKDAsIGQpKSkKICAgIHguc3RkIDwtIHQoeC5tcHMkdmFyLnN0ZCkKICAgIGRmIDwtIGRhdGEuZnJhbWUoY19wY3QgPSB4LnN0ZCwgZGVwdGggPSByb3cubmFtZXMoeC5zdGQpKQogICAgZGYkZGVwdGggPC0gZ3N1YigiIFteIF0qJCIsICIiLCBkZiRkZXB0aCkKICAgIHJldHVybihkZlsxOmxlbmd0aChkKSwgXSkKICB9KSwgLmlkID0gInByb19uYW1lIikKfQoKIyBkZXB0aCBzcGxpbmUgZm9yIG1vbm90b25pYyBjdW11bGF0aXZlIEMgc3RvY2tzOyBOQjogaW5wdXQgbXVzdCBiZSAyLWNvbCBkZiB3LyBkZXB0aCAoMSkgYW5kIGNtdHYgU09DICgyKQpTT0NzcGxpbmUuZnggPC0gZnVuY3Rpb24oeCwgZGVwdGhzLCBzb2MpIHsKICB0MCA8LSBkYXRhLmZyYW1lKGx5cl9ib3QgPSAwKQogIHQwW1tzb2NdXSA8LSAwCiAgdDAueCA8LSByYmluZCh0MCwgeCkKICAKICAjIGZpdCBtb25vdG9uaWMgY3ViaWMgc3BsaW5lCiAgc3AgPC0gc3BsaW5lKHQwLngsIG1ldGhvZCA9ICJoeW1hbiIpIAogIAogICMgY29udmVydCB0byBjbGFzcyAic3BsaW5lIiB3aXRoIHNtb290aC5zcGxpbmUgZnhuCiAgc3Auc3MgPC0gc21vb3RoLnNwbGluZShzcCwgYWxsLmtub3RzID0gVFJVRSkgCiAgbWF4LmQgPC0gbWF4KHhbICwgMV0pCiAgaWYgKG1heC5kIDwgMzEpIHsKICAgIG1heC5kIDwtIDMxCiAgfQogIAogICMgcHJlZGljdCBhdCBnaXZlbiBkZXB0aHMgKGxpbmVhciBiZXlvbmQgbGFzdCBtZWFzdXJlZCBkZXB0aCkKICBzcHAgPC0gcHJlZGljdChzcC5zcywgZGVwdGhzKSAKICBkZiA8LSBkYXRhLmZyYW1lKHNwcCkKICBjb2xuYW1lcyhkZikgPC0gYygibHlyX2JvdCIsICJseXJfc29jIikgCiAgCiAgIyBjYWxjdWxhdGUgc29jIHBlciBpbmNyZW1lbnQgZnJvbSBjbXR2IHZhbHVlcwogIGZvcihpIGluIHNlcV9hbG9uZyhkZiRseXJfYm90KSkgewogICAgaWYoaSA9PSAxKSB7CiAgICAgIGRmJGx5cl9zb2NbaV0gPC0gZGYkbHlyX3NvY1tpXQogICAgfSBlbHNlIHsKICAgICAgZGYkbHlyX3NvY1tpXSA8LSBkZiRseXJfc29jW2kgKyAxXSAtIGRmJGx5cl9zb2NbaV0KICAgIH0KICB9CiAgCiAgIyByZXR1cm4gCiAgZGYkbHlyX2JvdCA8LSBkZiRseXJfYm90ICsgMQogIHJldHVybihkZlstbGVuZ3RoKGRmJGx5cl9zb2MpLCBdKQp9CmBgYAoKIyMgQnVsayBDCiMjIyAyMDAxCmBgYHtyIGJsa2MtZGF0YS0yMDAxfQojIEZyYWN0aW9uIHNhbXBsZXMgY29tYmluZWQgMC0zIGFuZCAzLTggZGVwdGggaW5jcmVtZW50cyBmb3IgQlNyZiBhbmQgR1JyZgojIyBmdW5jdGlvbiBmb3IgY2FsY3VsYXRpbmcgZGVwdGgtd2VpZ2h0ZWQgYXZlcmFnZSBvZiBmaXJzdCB0d28gZGVwdGggaW5jcmVtZW50IEMgY29udGVudApkMWQyLmZ4IDwtIGZ1bmN0aW9uKGRmKSB7CiAgZDFkMiA8LSBkYXRhLmZyYW1lKElEID0gcGFzdGUoZGYkUE1lY29bMV0sIGRmJHByb19yZXBbMV0sIGRmJGx5cl90b3BbMV0sIGRmJGx5cl9ib3RbMl0sIHNlcCA9ICJfIiksCiAgICAgICAgICAgICAgICAgICAgIFBNZWNvID0gZGYkUE1lY29bMV0sCiAgICAgICAgICAgICAgICAgICAgIG1hc3Nfa2dtMiA9IHN1bShkZiRtYXNzX2tnbTJbMV0sIGRmJG1hc3Nfa2dtMlsyXSksCiAgICAgICAgICAgICAgICAgICAgIGNfcGN0ID0gc3VtKGRmJGNfcGN0WzFdICogKChkZiRseXJfYm90WzFdIC0gZGYkbHlyX3RvcFsxXSkgLyBkZiRseXJfYm90WzJdKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGYkY19wY3RbMl0gKiAoKGRmJGx5cl9ib3RbMl0gLSBkZiRseXJfdG9wWzJdKSAvIGRmJGx5cl9ib3RbMl0pKSwKICAgICAgICAgICAgICAgICAgICAgbHlyX3NvY19rZ20yID0gc3VtKGRmJGx5cl9zb2Nfa2dtMlsxXSwgZGYkbHlyX3NvY19rZ20yWzJdKSwKICAgICAgICAgICAgICAgICAgICAgcHJvX25hbWUgPSBkZiRwcm9fbmFtZVsxXSwKICAgICAgICAgICAgICAgICAgICAgbHlyX3RvcCA9IGRmJGx5cl90b3BbMV0sCiAgICAgICAgICAgICAgICAgICAgIGx5cl9ib3QgPSBkZiRseXJfYm90WzJdKQogIHJldHVybihyYmluZChkMWQyLAogICAgICAgICAgICAgICBkZlszOm5yb3coZGYpLCBdKSkKfQoKIyBDcmVhdGUgbGlzdApzb2MuMjAwMS5scyA8LSBsYXBwbHkoc3BsaXQoc29jLjIwMDEsIHNvYy4yMDAxJFBNZWNvKSwgZnVuY3Rpb24oZGYpIHsKICAKICAjIHJlbW92ZSBOQXMKICBkZiA8LSB0eXBlLmNvbnZlcnQoZGZbY29tcGxldGUuY2FzZXMoZGYpLCBdKQogIAogICMgZmlsdGVyIDwgMzZjbSwgcmVuYW1lIGNfcGN0LCBhZGQgbWFzcyBhbmQgc29jIHN0b2NrIGNvbHVtbnMKICBkZiA8LSBkZiAlPiUKICAgIGZpbHRlcihseXJfYm90IDwgMzYpICU+JQogICAgcmVuYW1lKGNfcGN0ID0gQy4pICU+JQogICAgbXV0YXRlKG1hc3Nfa2dtMiA9IGJkLmcuY20zICogKGx5cl9ib3QgLSBseXJfdG9wKSAqIGZpbmUuZWFydGguICogLjEsCiAgICAgICAgICAgbHlyX3NvY19rZ20yID0gbWFzc19rZ20yICogY19wY3QgKiAxMF4tMiwKICAgICAgICAgICBwcm9fbmFtZSA9IHBhc3RlKFBNZWNvLCBwcm9fcmVwLCBzZXAgPSAiXyIpKSAlPiUKICAgIHNlbGVjdChJRCwgUE1lY28sIG1hc3Nfa2dtMiwgY19wY3QsIGx5cl9zb2Nfa2dtMiwgcHJvX25hbWUsIGx5cl90b3AsIGx5cl9ib3QpCiAgCiAgIyBjb21iaW5lIDAtMywgMy04IGNtIGRlcHRocyBmb3IgR1JyZiwgQlNyZgogIGlmIChkZiRQTWVjb1sxXSA9PSAiR1JyZiIgfCBkZiRQTWVjb1sxXSA9PSAiQlNyZiIpIHsKICAgIGRmPC0gYmluZF9yb3dzKGxhcHBseShzcGxpdChkZiwgZGYkcHJvX25hbWUpLCBkMWQyLmZ4KSkKICB9CgogICMgY2FsY3VsYXRlIGNtdHYgc29jIHN0b2NrcwogIGxzIDwtIHNwbGl0KGRmLCBkZiRwcm9fbmFtZSkKICBscyA8LSBsYXBwbHkobHMsIGZ1bmN0aW9uKHgpIHsKICAgIHggPC0geFtvcmRlcih4JGx5cl9ib3QpLCBdICMgbWFrZSBzdXJlIHRvIG9yZGVyIGRhdGEKICAgIHgkbHlyX3NvY19jbXR2IDwtIE5BCiAgICBmb3IoaSBpbiBzZXFfYWxvbmcoeCRseXJfYm90KSkgewogICAgICBpZihpID09IDEpIHsKICAgICAgICB4JGx5cl9zb2NfY210dltpXSA8LSB4JGx5cl9zb2Nfa2dtMltpXQogICAgICB9IGVsc2UgewogICAgICAgIHgkbHlyX3NvY19jbXR2W2ldIDwtIHgkbHlyX3NvY19rZ20yW2ldICsgeCRseXJfc29jX2NtdHZbaS0xXSAKICAgICAgfQogICAgfQogICAgcmV0dXJuKHgpCiAgfSkKICByZXR1cm4odW5zcGxpdChscywgZGYkcHJvX25hbWUpKQp9KQoKIyBzdW1tYXJpemUKc29jLjIwMDEuc3VtLmRmIDwtIGJpbmRfcm93cyhzb2MuMjAwMS5scykgJT4lCiAgZ3JvdXBfYnkoUE1lY28sIGx5cl90b3AsIGx5cl9ib3QpICU+JQogIHN1bW1hcml6ZShhY3Jvc3MoYyhtYXNzX2tnbTIsIGNfcGN0LCBseXJfc29jX2tnbTIsIGx5cl9zb2NfY210diksIAogICAgICAgICAgICAuZm5zID0gbGlzdChtZWFuID0gbWVhbiwgc2QgPSBzZCkpLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUKICBtdXRhdGUoSUQyID0gcGFzdGUwKFBNZWNvLCAiXyIsIGx5cl90b3AsICItIiwgbHlyX2JvdCkpCmBgYAoKIyMjIDIwMDkKYGBge3IgYy1kYXRhLTIwMDl9CiMgY2FsY3VsYXRlIGN1bXVsYXRpdmUgc29jIHN0b2NrcyBmb3IgJzA5IGRhdGEKc3JhLjA5Lmx5ci5DIDwtIHVuc3BsaXQobGFwcGx5KAogIHNwbGl0KHNyYS4wOS5mcmMuZGYsIHNyYS4wOS5mcmMuZGYkcHJvX25hbWUpLCBmdW5jdGlvbih4KSB7CiAgICB4IDwtIHhbb3JkZXIoeCRseXJfYm90KSwgXSAjIG1ha2Ugc3VyZSB0byBvcmRlciBkYXRhCiAgICB4JGx5cl9zb2Nfa2dtMiA8LSB4JGx5cl9zb2MgKiAxMAogICAgeCRseXJfc29jX2NtdHYgPC0gTkEKICAgIGZvcihpIGluIHNlcV9hbG9uZyh4JGx5cl9ib3QpKSB7CiAgICAgIGlmKGkgPT0gMSkgewogICAgICAgIHgkbHlyX3NvY19jbXR2W2ldIDwtIHgkbHlyX3NvY19rZ20yW2ldCiAgICAgIH0gZWxzZSB7CiAgICAgICAgeCRseXJfc29jX2NtdHZbaV0gPC0geCRseXJfc29jX2tnbTJbaV0gKyB4JGx5cl9zb2NfY210dltpLTFdIAogICAgICB9CiAgICB9CiAgICByZXR1cm4oeCkKICB9KSwgc3JhLjA5LmZyYy5kZiRwcm9fbmFtZSkgJT4lCiAgcmVuYW1lKFBNZWNvID0gcHJvX25hbWUsCiAgICAgICAgIGZyY19jX3BjdCA9IGZyY19jX3BlcmMpICU+JQogIG11dGF0ZShmcmMgPSBpZmVsc2UoZnJjX3Byb3BlcnR5ID09ICJmcmVlIGxpZ2h0IiwgIkZQT00iLCAKICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShmcmNfcHJvcGVydHkgPT0gImhlYXZ5IiwgIk1PTSIsICJPUE9NIikpLAogICAgICAgICBQTSA9IHN1YnN0cihQTWVjbywgMSwgMiksCiAgICAgICAgIEVDTyA9IGZhY3RvcihzdWJzdHIoUE1lY28sIDMsIDQpLCBsZXZlbHMgPSBjKCJwcCIsICJ3ZiIsICJyZiIpKSwKICAgICAgICAgbWFzc19jX2cgPSBseXJfc29jX2tnbTIgKiBmcmNfY19wY3QgKiAxMF4tMikKYGBgCgojIyMgMjAxOQoKYGBge3IgbG9hZC0yMDE5LXNvY30KbG9hZCgiL1VzZXJzL2plZmYvc3JhLXRzL3NvdXJjZS9zcmEuMTkuYmxrQy5SRGF0YSIpCnNyYS5zb2MuMjAxOS5kZiA8LSBzcmEuMTkuYmxrQyAlPiUKICBmaWx0ZXIobHlyX2JvdCA8IDMxKSAlPiUKICBncm91cF9ieShQTWVjbywgbHlyX2JvdCkgJT4lCiAgc3VtbWFyaXplKGNfcGN0X2x5ciA9IG1lYW4oQyksIC5ncm91cHMgPSAiZHJvcCIpICU+JQogIG11dGF0ZShQTSA9IHN1YnN0cihQTWVjbywgMSwgMiksCiAgICAgICAgIEVDTyA9IHN1YnN0cihQTWVjbywgMywgNCkpCmBgYAoKIyMgRnJhY3Rpb24gQwojIyMgQywgQ04gcHJvZmlsZXMKCmBgYHtyIHBsb3QtYy1uLWNufQojIHBsb3QgZGVwdGggcHJvZmlsZXMKIyBwbG90IGZ4CmZyYy5wcm8ucGxvdCA8LSBmdW5jdGlvbihkZiwgeWVhciwgZnJhY3Rpb24sIHgpIHsKICBxdW9feCA8LSBzeW0oeCkKICB4bGFiIDwtIGlmZWxzZSh4ID09ICJDTiIsICJDTiIsIHBhc3RlKHgsICIoJSkiKSkKICBkZiRFQ08gPC0gZmFjdG9yKGRmJEVDTywgbGV2ZWxzID0gYygicHAiLCAid2YiLCAicmYiKSkKICBkZiA8LSBkZltvcmRlcihkZiRseXJfYm90KSwgXQogIGRmJG1pZGRlcHRoIDwtIGRmJGx5cl90b3AgKyAoZGYkbHlyX2JvdCAtIGRmJGx5cl90b3ApIC8gMgogIGdncGxvdChkZiwgYWVzKCEhIHF1b194LCBtaWRkZXB0aCwgY29sb3IgPSBQTSwgc2hhcGUgPSBFQ08pKSArCiAgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArCiAgICBnZW9tX3BvaW50KHNpemUgPSAzKSArCiAgICBnZW9tX3BhdGgoKSArCiAgICBzY2FsZV95X3JldmVyc2UobGltaXRzID0gYygzMCwgMCkpICsKICAgIHNjYWxlX3hfY29udGludW91cygpICsKICAgIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gIlBhcmVudCBtYXRlcmlhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiQU4iID0gImFuZGVzaXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCUyIgPSAiYmFzYWx0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHUiIgPSAiZ3Jhbml0ZSIpLAogICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoIkFOIiA9IGFuZGVzaXRlLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCUyIgPSBiYXNhbHQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdSIiA9IGdyYW5pdGUpKSArCiAgICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICJDbGltYXRlIiwKICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJwcCIgPSAid2FybSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmYiID0gImNvbGQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndmIiA9ICJjb29sIiksCiAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygicHAiID0gMTUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJmIiA9IDE2LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3ZiIgPSAxNykpICsKICAgIHhsYWIoeGxhYikgKwogICAgeWxhYigiRGVwdGggKGNtKSIpICsKICAgIGdndGl0bGUocGFzdGUoeWVhciwgZnJhY3Rpb24pKSArCiAgICB0aGVtZV9idygpICsKICAgIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCn0KCiMgQ29tYmluZSBwcm9maWxlcyBmb3IgcGxvdHRpbmcKZnJjLkMuMDEucGxvdC5scyA8LSBsYXBwbHkoc3JhLmZyYy4yMDAxLmxzLCBiaW5kX3Jvd3MsIC5pZCA9ICJmcmFjdGlvbiIpCmxhcHBseShzZXFfYWxvbmcoZnJjLkMuMDEucGxvdC5scyksIGZ1bmN0aW9uKGkpIHsKICBmcmMucHJvLnBsb3QoZnJjLkMuMDEucGxvdC5sc1tbaV1dLCAyMDAxLCBuYW1lcyhmcmMuQy4wMS5wbG90LmxzKVtpXSwgIkMiKQp9KQoKZnJjLkMuMTkucGxvdC5scyA8LSBsYXBwbHkoc3JhLmZyYy4yMDE5LmxzLCBiaW5kX3Jvd3MsIC5pZCA9ICJmcmFjdGlvbiIpCmxhcHBseShzZXFfYWxvbmcoZnJjLkMuMTkucGxvdC5scyksIGZ1bmN0aW9uKGkpIHsKICBmcmMucHJvLnBsb3QoZnJjLkMuMTkucGxvdC5sc1tbaV1dLCAyMDE5LCBuYW1lcyhmcmMuQy4xOS5wbG90LmxzKVtpXSwgIkMiKQp9KQoKIyBDYWxjdWxhdGUgYW5kIHBsb3QgQ04KbGFwcGx5KHNlcV9hbG9uZyhmcmMuQy4wMS5wbG90LmxzKSwgZnVuY3Rpb24oaSkgewogIGZyYy5DLjAxLnBsb3QubHNbW2ldXVtbIkNOIl1dIDwtIGZyYy5DLjAxLnBsb3QubHNbW2ldXVtbIkMiXV0gLyBmcmMuQy4wMS5wbG90LmxzW1tpXV1bWyJOIl1dCiAgZnJjLnByby5wbG90KGZyYy5DLjAxLnBsb3QubHNbW2ldXSwgMjAwMSwgbmFtZXMoZnJjLkMuMDEucGxvdC5scylbaV0sICJDTiIpCn0pCmxhcHBseShzZXFfYWxvbmcoZnJjLkMuMTkucGxvdC5scyksIGZ1bmN0aW9uKGkpIHsKICBmcmMuQy4xOS5wbG90LmxzW1tpXV1bWyJDTiJdXSA8LSBmcmMuQy4xOS5wbG90LmxzW1tpXV1bWyJDIl1dIC8gZnJjLkMuMTkucGxvdC5sc1tbaV1dW1siTiJdXQogIGZyYy5wcm8ucGxvdChmcmMuQy4xOS5wbG90LmxzW1tpXV0sIDIwMTksIG5hbWVzKGZyYy5DLjE5LnBsb3QubHMpW2ldLCAiQ04iKQp9KQpgYGAKCiMjIyBDIGRpc3RyaWJ1dGlvbgoKYGBge3IgbWVyZ2UtZnJjLW1hc3MtQ30KIyMgbWVyZ2UgQyBhbmQgbWFzcyBkYXRhCiMgJzAxCnNyYS5mcmMubXNzLkMuMDEuZGYgPC0gbWVyZ2UoCiAgYmluZF9yb3dzKAogICAgbGFwcGx5KHNyYS5mcmMuMjAwMS5scywgZnVuY3Rpb24obHMpIGJpbmRfcm93cyhscywgLmlkID0gIlBNZWNvIikpLCAuaWQgPSAiZnJjIiksCiAgc3JhLmZyYy5tc3MubG9uZy4wMS5kZiwgYnkgPSBjKCJ5ZWFyIiwgIlBNZWNvIiwgImx5cl9ib3QiLCAibHlyX3RvcCIsICJmcmMiKSkgJT4lIAogIG11dGF0ZShJRDIgPSBzdWIoImNvbXBfMjAwMV8iLCB4ID0gSUQsIHJlcGxhY2VtZW50ID0gIiIpKQoKIyBjYWxjdWxhdGUgQyB3ZWlnaHRzCnNyYS5mcmMubXNzLkMuMDEuZGYkbWFzc19jX2cgPC0gc3JhLmZyYy5tc3MuQy4wMS5kZiRtYXNzX3N1bSAqIChzcmEuZnJjLm1zcy5DLjAxLmRmJG1hc3NfcGN0IC8gMTAwKSAqIChzcmEuZnJjLm1zcy5DLjAxLmRmJEMgLyAxMDApCgojIGNhbGMgc3ludGhldGljIGx5cl9jIChhcyBzdW0gb2YgZnJjIGMgbWFzc2VzKSBhbmQgcGVyY2VudAppZiAoISgibHlyX2NfbWFzc19zeW4iICVpbiUgbmFtZXMoc3JhLmZyYy5tc3MuQy4wMS5kZikpKSB7CiAgc3JhLmZyYy5tc3MuQy4wMS5kZiA8LSBzcmEuZnJjLm1zcy5DLjAxLmRmICU+JQogICAgZ3JvdXBfYnkoeWVhciwgUE1lY28sIGx5cl9ib3QpICU+JQogICAgc3VtbWFyaXplKGx5cl9jX21hc3Nfc3luID0gc3VtKG1hc3NfY19nKSwgLmdyb3VwcyA9ICJkcm9wIikgJT4lCiAgICByaWdodF9qb2luKC4sIHNyYS5mcmMubXNzLkMuMDEuZGYsIGJ5ID0gYygieWVhciIsICJQTWVjbyIsICJseXJfYm90IikpCn0Kc3JhLmZyYy5tc3MuQy4wMS5kZiRmcmNfY19wY3QgPC0gc3JhLmZyYy5tc3MuQy4wMS5kZiRtYXNzX2NfZyAvIHNyYS5mcmMubXNzLkMuMDEuZGYkbHlyX2NfbWFzc19zeW4KCiMgYWRkIGx5ciBDCnNyYS5mcmMubXNzLkMuMDEuZGYkbHlyX2NfcGN0IDwtIHVubGlzdChzb2MuMjAwMS5zdW0uZGZbCiAgbWF0Y2goc3JhLmZyYy5tc3MuQy4wMS5kZiRJRDIsIHNvYy4yMDAxLnN1bS5kZiRJRDIpLCAiY19wY3RfbWVhbiJdKQoKIyByZWxldmVsIGZyYWN0aW9uIGZhY3RvcgpzcmEuZnJjLm1zcy5DLjAxLmRmJGZyYyA8LSBmYWN0b3Ioc3JhLmZyYy5tc3MuQy4wMS5kZiRmcmMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiRlBPTSIsICJPUE9NIiwgIk1PTSIpKQoKIyBjb252ZXJ0IHRvIGRhdGEuZnJhbWUKc3JhLmZyYy5tc3MuQy4wMS5kZiA8LSBkYXRhLmZyYW1lKHNyYS5mcmMubXNzLkMuMDEuZGYpCgojIGFkZCBtaWRkZXB0aApzcmEuZnJjLm1zcy5DLjAxLmRmJG1pZGRlcHRoIDwtIHNyYS5mcmMubXNzLkMuMDEuZGYkbHlyX3RvcCArCiAgKHNyYS5mcmMubXNzLkMuMDEuZGYkbHlyX2JvdCAtIHNyYS5mcmMubXNzLkMuMDEuZGYkbHlyX3RvcCkgLyAyCgojIyAnMTkKc3JhLmZyYy5tc3MuQy4xOS5kZiA8LSBtZXJnZSgKICBiaW5kX3Jvd3MoCiAgICBsYXBwbHkoc3JhLmZyYy4yMDE5LmxzLCBmdW5jdGlvbihscykgYmluZF9yb3dzKGxzLCAuaWQgPSAiUE1lY28iKSksIC5pZCA9ICJmcmMiKSwKICBzcmEuZnJjLm1zcy5sb25nLjE5LmRmLCBieSA9IGMoInllYXIiLCAiUE1lY28iLCAibHlyX2JvdCIsICJseXJfdG9wIiwgImZyYyIpKSAlPiUgCiAgbXV0YXRlKElEMiA9IHN1YigiY29tcF8yMDE5XyIsIHggPSBJRCwgcmVwbGFjZW1lbnQgPSAiIikpCgojIGNhbGN1bGF0ZSBDIHdlaWdodHMKc3JhLmZyYy5tc3MuQy4xOS5kZiRtYXNzX2NfZyA8LSBzcmEuZnJjLm1zcy5DLjE5LmRmJG1hc3Nfc3VtICooc3JhLmZyYy5tc3MuQy4xOS5kZiRtYXNzX3BjdCAvIDEwMCkgKiAoc3JhLmZyYy5tc3MuQy4xOS5kZiRDIC8gMTAwKQoKIyBhZGQgbHlyIEMKc3JhLmZyYy5tc3MuQy4xOS5kZiRseXJfY19wY3QgPC0gdW5saXN0KHNyYS5ibGsuMjAxOS5zdW0uZGZbCiAgbWF0Y2goc3JhLmZyYy5tc3MuQy4xOS5kZiRJRDIsIHNyYS5ibGsuMjAxOS5zdW0uZGYkSUQyKSwgIkNfbWVhbiJdKQoKIyBjYWxjIHN5bnRoZXRpYyBseXJfYyAoYXMgc3VtIG9mIGZyYyBjIG1hc3NlcykgYW5kIHBlcmNlbnQKaWYgKCEoImx5cl9jX21hc3Nfc3luIiAlaW4lIG5hbWVzKHNyYS5mcmMubXNzLkMuMTkuZGYpKSkgewogIHNyYS5mcmMubXNzLkMuMTkuZGYgPC0gc3JhLmZyYy5tc3MuQy4xOS5kZiAlPiUKICAgIGdyb3VwX2J5KHllYXIsIFBNZWNvLCBseXJfYm90KSAlPiUKICAgIHN1bW1hcml6ZShseXJfY19tYXNzX3N5biA9IHN1bShtYXNzX2NfZyksIC5ncm91cHMgPSAiZHJvcCIpICU+JQogICAgcmlnaHRfam9pbiguLCBzcmEuZnJjLm1zcy5DLjE5LmRmLCBieSA9IGMoInllYXIiLCAiUE1lY28iLCAibHlyX2JvdCIpKQp9CnNyYS5mcmMubXNzLkMuMTkuZGYkZnJjX2NfcGN0IDwtIHNyYS5mcmMubXNzLkMuMTkuZGYkbWFzc19jX2cgLyBzcmEuZnJjLm1zcy5DLjE5LmRmJGx5cl9jX21hc3Nfc3luCnNyYS5mcmMubXNzLkMuMTkuZGYkRUNPIDwtIGZhY3RvcihzcmEuZnJjLm1zcy5DLjE5LmRmJEVDTywgbGV2ZWxzID0gYygicHAiLCAid2YiLCAicmYiKSkKYGBgCgpgYGB7ciBwbG90LWZyY0MtcGN0LWZ4fQojIGJveCBwbG90IGZ4CmZyY19jX3BjdC5wbG90LmZ4IDwtIGZ1bmN0aW9uKGRmLCBmaWxsX3ZhcikgewogIAogICMgc2V0IGZpbGwgdmFyaWFibGUgYW5kIGd1aWRlcwogIHF1b19maWxsX3ZhciA8LSBzeW0oZmlsbF92YXIpCiAgaWYgKGZpbGxfdmFyID09ICJQTSIpIHsKICAgIGZpbGxfdmFscyA8LSBjKCJBTiIgPSBhbmRlc2l0ZSwgIkJTIiA9IGJhc2FsdCwgIkdSIiA9IGdyYW5pdGUpCiAgfSBlbHNlIHsKICAgIGZpbGxfdmFscyA8LSBjKCJwcCIgPSB3YXJtLCAid2YiID0gY29vbCwgInJmIiA9IGNvbGQpCiAgfQogIAogICMgcGxvdAogZGYgJT4lCiAgbXV0YXRlKGZyYyA9IGZhY3RvcihmcmMsIGxldmVscyA9IGMoIkZQT00iLCAiT1BPTSIsICJNT00iKSkpICU+JQogIGdncGxvdCguLCBhZXMoZnJjLCBmcmNfY19wY3QpKSArCiAgZ2VvbV9ib3hwbG90KGFlcyhmaWxsID0gISEgcXVvX2ZpbGxfdmFyKSwgcG9zaXRpb24gPSAiZG9kZ2UiKSArCiAgc2NhbGVfZmlsbF9tYW51YWwobmFtZSA9IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gZmlsbF92YWxzKSArCiAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhkZXB0aCkpICsKICB5bGFiKCJDIHBhcnRpdGlvbmluZyAoJSkiKSArCiAgeGxhYihOVUxMKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkgCn0KYGBgCgpgYGB7ciBwbG90LWZyY0MtcGN0LTAxfQojIDIwMDEKIyMgcHJlcCBmeApzcmEuZnJjLm1zcy5DLjAxLnByZXAuZnggPC0gZnVuY3Rpb24oZGYpIHsKICBiaW5kX3Jvd3MoCiAgICBsYXBwbHkoc3BsaXQoZGYsIGRmJFBNZWNvKSwgZnVuY3Rpb24oZCkgewogICAgICBiaW5kX3Jvd3MobGFwcGx5KHNwbGl0KGQsIGQkZnJjKSwgZnVuY3Rpb24oZikgewogICAgICAgIGYgPC0gZltvcmRlcihmJGx5cl9ib3QpLCBdCiAgICAgICAgZiRkZXB0aCA8LSBzZXEoMSwgbnJvdyhmKSkKICAgICAgICByZXR1cm4oZikKICAgICAgfSkpCiAgICB9KSkKfQoKIyMgUE0KZnJjX2NfcGN0LnBsb3QuZngoc3JhLmZyYy5tc3MuQy4wMS5wcmVwLmZ4KHNyYS5mcmMubXNzLkMuMDEuZGYpLCAKICAgICAgICAgICAgICAgICAgZmlsbF92YXIgPSAiUE0iKQoKIyMgRUNPCmZyY19jX3BjdC5wbG90LmZ4KHNyYS5mcmMubXNzLkMuMDEucHJlcC5meChzcmEuZnJjLm1zcy5DLjAxLmRmKSwgCiAgICAgICAgICAgICAgICAgIGZpbGxfdmFyID0gIkVDTyIpCmBgYAoKYGBge3IgcGxvdC1mcmNDLXBjdC0wOX0KIyAyMDA5CmZyY19jX3BjdC5wbG90LmZ4KHNyYS5mcmMubXNzLkMuMDEucHJlcC5meChzcmEuMDkubHlyLkMpLCAiUE0iKQpmcmNfY19wY3QucGxvdC5meChzcmEuZnJjLm1zcy5DLjAxLnByZXAuZngoc3JhLjA5Lmx5ci5DKSwgIkVDTyIpCmBgYAoKYGBge3IgcGxvdC1mcmNDLXBjdC0xOX0KIyAyMDE5CmZyY19jX3BjdC5wbG90LmZ4KHNyYS5mcmMubXNzLkMuMTkuZGYsICJQTSIpCmZyY19jX3BjdC5wbG90LmZ4KHNyYS5mcmMubXNzLkMuMTkuZGYsICJFQ08iKQpgYGAKCmBgYHtyIGMtZGlzdC1wbS1lY299CnNyYS5mcmMubXNzLkMuMTkuZGYgJT4lCiAgbXV0YXRlKGNfbWFzc193dCA9IG1hc3NfY19nIC8gc3VtKG1hc3NfY19nKSwKICAgICAgICAgZWNvID0gZmFjdG9yKGlmZWxzZShFQ08gPT0gInBwIiwgIldBUk0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShFQ08gPT0gIndmIiwgIkNPT0wiLCAiQ09MRCIpKSwKICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIldBUk0iLCAiQ09PTCIsICJDT0xEIikpLAogICAgICAgICBwbSA9IGlmZWxzZShQTSA9PSAiQU4iLCAiYW5kZXNpdGUiLAogICAgICAgICAgICAgICAgICAgICBpZmVsc2UoUE0gPT0gIkJTIiwgImJhc2FsdCIsICJncmFuaXRlIikpKSAlPiUKICBncm91cF9ieShwbSwgZWNvLCBmcmMpICU+JQogIHN1bW1hcml6ZShmcmNfY19wY3RfMzAgPSByb3VuZCh3ZWlnaHRlZC5tZWFuKGZyY19jX3BjdCwgY19tYXNzX3d0KSAqIDEwMCwgMCksCiAgICAgICAgICAgIC5ncm91cHMgPSAiZHJvcCIpICU+JQogIG11dGF0ZShmcmMgPSBmYWN0b3IoZnJjLCBsZXZlbHMgPSBjKCJGUE9NIiwgIk1PTSIsICJPUE9NIiksCiAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJmcmVlIGxpZ2h0IiwgImhlYXZ5IiwgIm9jY2x1ZGVkIGxpZ2h0IikpKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKHBtLCBmcmNfY19wY3RfMzApKSArCiAgZ2VvbV9jb2woYWVzKGZpbGwgPSBwbSksIHBvc2l0aW9uID0gImRvZGdlIikgKwogIHNjYWxlX2ZpbGxfbWFudWFsKG5hbWUgPSBOVUxMLAogICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImFuZGVzaXRlIiA9IGFuZGVzaXRlLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYXNhbHQiID0gYmFzYWx0LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJncmFuaXRlIiA9IGdyYW5pdGUpKSArCiAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhlY28pLCByb3dzID0gdmFycyhmcmMpKSArCiAgeWxhYigiQyBwYXJ0aXRpb25pbmcgKCUpIikgKwogIHhsYWIoTlVMTCkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aWNrcy54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLAogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksCiAgICAgICAgc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIHNpemUgPSAxMiksCiAgICAgICAgc3RyaXAudGV4dC55ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIGFuZ2xlID0gMCwgc2l6ZSA9IDEyKSwKICAgICAgICBzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAid2hpdGUiLCBjb2xvciA9ICJ3aGl0ZSIpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLAogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMikpIApgYGAKCmBgYHtyIGNhbGMtZnJjLUMtZGlzdHItZXJyfQojIG1ha2Ugd2lkZSBkYXRhZnJhbWUgZm9yIDIwMTkgZnJjIGRhdGEKbWVyZ2UudmFycyA8LSBjKCJ5ZWFyIiwgIlBNIiwgIkVDTyIsICJseXJfYm90IikKc3JhLmZyYy4yMDE5LmRmIDwtIG1lcmdlKAogIG1lcmdlKGJpbmRfcm93cyhzcmEuZnJjLjIwMTkubHMkRlBPTSlbLCBjKG1lcmdlLnZhcnMsICJDIiwgIk4iKV0sCiAgICAgICAgYmluZF9yb3dzKHNyYS5mcmMuMjAxOS5scyRPUE9NKVssIGMobWVyZ2UudmFycywgIkMiLCAiTiIpXSwKICAgICAgICBieSA9IG1lcmdlLnZhcnMsIHN1ZmZpeGVzID0gYygiX2ZQT00iLCAiX29QT00iKSksCiAgYmluZF9yb3dzKHNyYS5mcmMuMjAxOS5scyRNT00pWywgYyhtZXJnZS52YXJzLCAiQyIsICJOIildLCBieSA9IG1lcmdlLnZhcnMpICU+JQogIHJlbmFtZShDX21pbkMgPSBDLCBOX21pbkMgPSBOKQoKIyBmaWxsIG1pc3Npbmcgb1BPTSBkYXRhCnNyYS5mcmMubXNzLndpZGUuZmlsbC5kZiA8LSBzcmEuZnJjLm1zcy5sc3MuZGYKc3JhLmZyYy5tc3Mud2lkZS5maWxsLmRmJG9QT00gPC0gaWZlbHNlKAogIGlzLm5hKHNyYS5mcmMubXNzLndpZGUuZGYkT1BPTSksCiAgc3JhLmZyYy5tc3Mud2lkZS5kZiR3dF9nIC0gKHNyYS5mcmMubXNzLndpZGUuZGYkRlBPTSArIHNyYS5mcmMubXNzLndpZGUuZGYkTU9NKSwKICBzcmEuZnJjLm1zcy53aWRlLmRmJE9QT00pCgojIGNhbGN1bGF0ZSBtYXNzIHByZWNlbnRhZ2VzCnNyYS5mcmMubXNzLndpZGUuZmlsbC5kZiA8LSBzcmEuZnJjLm1zcy53aWRlLmZpbGwuZGYgJT4lCiAgbXV0YXRlKGZQT01fbWFzc19mcmFjID0gRlBPTSAvIHd0X2csCiAgICAgICAgIG9QT01fbWFzc19mcmFjID0gT1BPTSAvIHd0X2csCiAgICAgICAgIG1pbkNfbWFzc19mcmFjID0gTU9NIC8gd3RfZywKICAgICAgICAgUE1lY28gPSBwYXN0ZTAoUE0sIEVDTykpCgojICMgbW9kZWwKIyBzdW1tYXJ5KGxtKGZQT01fbWFzc19mcmFjIH4gUE0gKyBFQ08sIAojICAgICAgICAgICAgc3JhLmZyYy5tc3Mud2lkZS5maWxsLmRmW3NyYS5mcmMubXNzLndpZGUuZmlsbC5kZiRseXJfYm90ID09IDEwICYgc3JhLmZyYy5tc3Mud2lkZS5maWxsLmRmJHllYXIgPT0gMjAxOSxdKSkKIyBzdW1tYXJ5KGxtKG9QT01fbWFzc19mcmFjIH4gUE0gKyBFQ08sIAojICAgICAgICAgICAgc3JhLmZyYy5tc3Mud2lkZS5maWxsLmRmW3NyYS5mcmMubXNzLndpZGUuZmlsbC5kZiRseXJfYm90ID09IDEwICYgc3JhLmZyYy5tc3Mud2lkZS5maWxsLmRmJHllYXIgPT0gMjAxOSxdKSkKIyBzdW1tYXJ5KGxtKG1pbkNfbWFzc19mcmFjIH4gUE0gKyBFQ08sIAojICAgICAgICAgICAgc3JhLmZyYy5tc3Mud2lkZS5maWxsLmRmW3NyYS5mcmMubXNzLndpZGUuZmlsbC5kZiRseXJfYm90ID09IDEwICYgc3JhLmZyYy5tc3Mud2lkZS5maWxsLmRmJHllYXIgPT0gMjAxOSxdKSkKCiMgcGxvdApzcmEuZnJjLm1zcy5maWxsLnBsb3QuZGYgPC0gc3JhLmZyYy5tc3Mud2lkZS5maWxsLmRmICU+JQogIHBpdm90X2xvbmdlcihjb2xzID0gY29udGFpbnMoIm1hc3NfZnJhYyIpLCBuYW1lc190byA9ICJGcmFjdGlvbiIsIHZhbHVlc190byA9ICJNYXNzIHBlcmNlbnQiKSAlPiUKICBtdXRhdGUoRnJhY3Rpb24gPSBmYWN0b3IoRnJhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoImZQT01fbWFzc19mcmFjIiwgIm9QT01fbWFzc19mcmFjIiwgIm1pbkNfbWFzc19mcmFjIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoImZQT01fbWFzc19mcmFjIiA9ICJmUE9NIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib1BPTV9tYXNzX2ZyYWMiID0gIm9QT00iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWluQ19tYXNzX2ZyYWMiID0gIm1pbkMiKSkpCgojIDIwMTkKc3JhLmZyYy5tc3MuZmlsbC5wbG90LmRmICU+JQogIGZpbHRlcih5ZWFyID09IDIwMTkpICU+JQogIGdncGxvdCguLCBhZXMoUE1lY28sIGBNYXNzIHBlcmNlbnRgLCBmaWxsID0gRnJhY3Rpb24pKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMSwgY29sb3IgPSAiYmxhY2siKSArCiAgZ2VvbV9jb2woKSArCiAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhkZXB0aCkpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKQoKIyAyMDAxIHRvbyBoYXJkIHRvIHBsb3Qgd2l0aCBhbGwgZGVwdGhzCnNyYS5mcmMubXNzLmZpbGwucGxvdC5kZiAlPiUKICBmaWx0ZXIoeWVhciA9PSAyMDAxKSAlPiUKICBncm91cF9ieShQTWVjbywgRnJhY3Rpb24pICU+JQogIHN1bW1hcml6ZShgTWFzcyBwZXJjZW50YCA9IG1lYW4oYE1hc3MgcGVyY2VudGApKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKFBNZWNvLCBgTWFzcyBwZXJjZW50YCwgZmlsbCA9IEZyYWN0aW9uKSkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDEsIGNvbG9yID0gImJsYWNrIikgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCgojIG1lcmdlIHcvIGZyYyBsaXN0cwpzcmEuZnJjLnNvYy4yMDAxLmxzIDwtIGxhcHBseShsYXBwbHkoc3JhLmZyYy4yMDAxLmxzLCBiaW5kX3Jvd3MpLCBmdW5jdGlvbihkZikgewogIG1lcmdlKGRmLCAKICAgICAgICBzb2MuMjAwMS5zdW0uZGYgJT4lCiAgICAgICAgICBtdXRhdGUoUE0gPSBzdWJzdHIoUE1lY28sIDEsIDIpLAogICAgICAgICAgICAgICAgIEVDTyA9IHN1YnN0cihQTWVjbywgMywgNCkpICU+JQogICAgICAgICAgc2VsZWN0KFBNLCBFQ08sIGx5cl9ib3QsIGx5cl90b3AsIGNfcGN0X21lYW4sIGx5cl9zb2Nfa2dtMl9tZWFuKSAlPiUKICAgICAgICAgIHJlbmFtZShjX3BjdF9seXIgPSBjX3BjdF9tZWFuLAogICAgICAgICAgICAgICAgIGx5cl9zb2MgPSBseXJfc29jX2tnbTJfbWVhbiksIAogICAgICAgIGJ5ID0gYygiUE0iLCAiRUNPIiwgImx5cl9ib3QiLCAibHlyX3RvcCIpKSAlPiUKICAgIHNlbGVjdCgtYygiSUQiLCAibHlyX3NvYyIpKSAlPiUKICAgIG11dGF0ZSh5ZWFyID0gMjAwMSkKfSkKc3JhLmZyYy5zb2MuMjAxOS5scyA8LSBsYXBwbHkobGFwcGx5KHNyYS5mcmMuMjAxOS5scywgYmluZF9yb3dzKSwgZnVuY3Rpb24oZGYpIHsKICBtZXJnZShkZiwgc3JhLnNvYy4yMDE5LmRmLCBieSA9IGMoIlBNIiwgIkVDTyIsICJseXJfYm90IikpICU+JQogICAgc2VsZWN0KC1jKCJJRCIsICJQTWVjbyIpKQp9KQoKIyBtZXJnZSAwMSwgMTkKc3JhLmZyYy5zb2MuMDEuMTkubHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhzcmEuZnJjLnNvYy4yMDE5LmxzKSwgZnVuY3Rpb24oaSkgewogIHJiaW5kKHNyYS5mcmMuc29jLjIwMTkubHNbW2ldXSwgc3JhLmZyYy5zb2MuMjAwMS5sc1tbaV1dKQp9KQpuYW1lcyhzcmEuZnJjLnNvYy4wMS4xOS5scykgPC0gbmFtZXMoc3JhLmZyYy5zb2MuMjAxOS5scykKCiMgbWVyZ2UgbWFzcyBmcmMKc3JhLmZyYy5tc3MuZmlsbC5sb25nLmxzIDwtIHNwbGl0KHNyYS5mcmMubXNzLmZpbGwucGxvdC5kZiwgc3JhLmZyYy5tc3MuZmlsbC5wbG90LmRmJEZyYWN0aW9uKQpzcmEuZnJjLm1zcy5maWxsLmxvbmcubHMgPC0gbGFwcGx5KHNyYS5mcmMubXNzLmZpbGwubG9uZy5scywgZnVuY3Rpb24oZGYpIHsKICBkZlsgLCBjKCJQTSIsICJFQ08iLCAieWVhciIsICJseXJfYm90IiwgIk1hc3MgcGVyY2VudCIpXQp9KQpzcmEuZnJjLnNvYy5scyA8LSBtYXBwbHkoCiAgbWVyZ2UsCiAgc3JhLmZyYy5zb2MuMDEuMTkubHMsCiAgc3JhLmZyYy5tc3MuZmlsbC5sb25nLmxzLAogIFNJTVBMSUZZID0gRkFMU0UpCgojIENhbGN1bGF0ZSBDIHBjdCBvZiBsYXllciwgYWJzb2x1dGUgQywgc3RvY2sgcGVyIGZyYWN0aW9uCnNyYS5mcmMuc29jLmRmIDwtIGJpbmRfcm93cyhzcmEuZnJjLnNvYy5scywgLmlkID0gIkZyYWN0aW9uIikKc3JhLmZyYy5zb2MuZGYkZnJjX0NfbHlyIDwtIChzcmEuZnJjLnNvYy5kZiRDICogc3JhLmZyYy5zb2MuZGYkYE1hc3MgcGVyY2VudGApIC8KICAgIHNyYS5mcmMuc29jLmRmJGNfcGN0X2x5cgpzcmEuZnJjLnNvYy53aWRlLmRmIDwtIHBpdm90X3dpZGVyKAogIHNyYS5mcmMuc29jLmRmLCAKICBpZF9jb2xzID0gYygieWVhciIsICJQTSIsICJFQ08iLCAibHlyX2JvdCIsICJjX3BjdF9seXIiLCksIAogIG5hbWVzX2Zyb20gPSBjKCJGcmFjdGlvbiIpLCB2YWx1ZXNfZnJvbSA9IGMoIkMiLCAiTWFzcyBwZXJjZW50IiwgImZyY19DX2x5ciIpKSAlPiUKICBtZXJnZSguLCBzcmEuZnJjLm1zcy53aWRlLmZpbGwuZGZbICwgYygiUE0iLCAiRUNPIiwgImx5cl9ib3QiLCAieWVhciIsICJ3dF9nIildKQoKIyBzdW0gZ0MgZnJjCnNyYS5mcmMuc29jLndpZGUuZGYkY19wY3RfbHlyX2ZyYyA8LSByb3dTdW1zKHNyYS5mcmMuc29jLndpZGUuZGZbLCBjKCJmcmNfQ19seXJfRlBPTSIsICJmcmNfQ19seXJfT1BPTSIsICJmcmNfQ19seXJfTU9NIildKSAqIDEwMApzcmEuZnJjLnNvYy53aWRlLmRmJENfZGlmZiA8LSBzcmEuZnJjLnNvYy53aWRlLmRmJGNfcGN0X2x5cl9mcmMgLSAxMDAKYGBgCgpgYGB7ciBwbG90LWMtbG9zc30KIyAyMDAxCiMgc3JhLmZyYy5zb2Mud2lkZS5kZiAlPiUKIyAgIGZpbHRlcih5ZWFyID09IDIwMDEpICU+JQojICAgbXV0YXRlKFBNZWNvID0gcGFzdGUwKFBNLCBFQ08pKSAlPiUKIyAgIGdncGxvdCguLCBhZXMoUE1lY28sIHNvY19sb3N0KSkgKwojICAgZ2VvbV9jb2woKSArCiMgICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKGx5cl9ib3QpKSArCiMgICB0aGVtZV9idygpICsKIyAgIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCgojIDIwMTkKc3JhLmZyYy5zb2Mud2lkZS5kZiAlPiUKICBmaWx0ZXIoeWVhciA9PSAyMDE5KSAlPiUKICBtdXRhdGUoU2l0ZSA9IGZhY3RvcihwYXN0ZTAoUE0sIEVDTyksIAogICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIkFOcHAiLCAiQU53ZiIsICJBTnJmIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQlNwcCIsICJCU3dmIiwgIkJTcmYiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHUnBwIiwgIkdSd2YiLCAiR1JyZiIpKSwKICAgICAgICAgYEMgZGlmLiAoJSBvZiB0b3RhbCBzdG9jaylgID0gQ19kaWZmKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKFNpdGUsIGBDIGRpZi4gKCUgb2YgdG90YWwgc3RvY2spYCkpICsKICBnZW9tX2NvbCgpICsKICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKGx5cl9ib3QpKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCgojIyBGcmFjdGlvbiAxNEMKIyMjIERlcHRoIHByb2ZpbGVzCgpgYGB7ciBzaGFwZS1kZW5zMTRDLWRmfQojIGZ1bmN0aW9uIGZvciBzcGxpdHRpbmcgc2FtcGxlIG5hbWVzIGFuZCBleHRyYWN0aW5nIHZhbHVlcyBmcm9tIGFtcyBsaXN0CnVTY29yZVNwbGl0LmZ4IDwtIGZ1bmN0aW9uKGRmLCBpeCkgc2FwcGx5KHN0cnNwbGl0KGRmW1siUHJvYmUiXV0sICJfIiksICJbWyIsIGl4KQoKIyBjcmVhdGUgZGYKZGVucy5kZiA8LSBiaW5kX3Jvd3MoCiAgbGFwcGx5KAogICAgYW1zX3Jlc3VsdHNfbHNbLWdyZXAoInRobWwiLCBuYW1lcyhhbXNfcmVzdWx0c19scykpXSwgZnVuY3Rpb24obHMpIHsKICAgICAgZGYuZXggPC0gZnVuY3Rpb24oeCwgZnJjKSB7CiAgICAgICAgYmluZF9yb3dzKGxhcHBseSh4LCBmdW5jdGlvbihkZikgewogICAgICAgICAgZGZbZ3JlcChmcmMsIGRmJFByb2JlKSwgMjo2XQogICAgICAgIH0pKQogICAgICB9CiAgICAgIGZQT00gPC0gZGYuZXgobHMsICJGUE9NIikKICAgICAgb1BPTSA8LSBkZi5leChscywgIk9QT00iKQogICAgICBtaW5DIDwtIGRmLmV4KGxzLCAiTU9NIikKICAgICAgcmV0dXJuKAogICAgICAgIGNiaW5kKHJiaW5kKGZQT00sIG9QT00sIG1pbkMpLCBmcmMgPSBjKHJlcCgiZlBPTSIsIG5yb3coZlBPTSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcCgib1BPTSIsIG5yb3cob1BPTSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcCgibWluQyIsIG5yb3cobWluQykpKSkpCiAgICB9KSkgJT4lCiAgbXV0YXRlKFBNZWNvID0gdVNjb3JlU3BsaXQuZngoLiwgMiksCiAgICAgICAgIFBNID0gc3Vic3RyKFBNZWNvLCAxLCAyKSwKICAgICAgICAgRUNPID0gZmFjdG9yKHN1YnN0cihQTWVjbywgMywgNCksIGxldmVscyA9IGMoInBwIiwgIndmIiwgInJmIikpLAogICAgICAgICBZZWFyID0gdVNjb3JlU3BsaXQuZngoLiwgNCksCiAgICAgICAgIHByb19uYW1lID0gcGFzdGUwKFBNZWNvLCAiXyIsIFllYXIpLAogICAgICAgICBkZXB0aHMgPSB1U2NvcmVTcGxpdC5meCguLCA1KSwKICAgICAgICAgbHlyX3RvcCA9IGFzLm51bWVyaWMoc2FwcGx5KHN0cnNwbGl0KGRlcHRocywgIi0iKSwgIltbIiwgMSkpLAogICAgICAgICBseXJfYm90ID0gYXMubnVtZXJpYyhzYXBwbHkoc3Ryc3BsaXQoZGVwdGhzLCAiLSIpLCAiW1siLCAyKSkpICU+JQogIHJlbmFtZShmcmNfMTRjID0gIuKIhjE0Qy4o4oCwKSIsCiAgICAgICAgIGZyY18xNGNfZXJyID0gImVyci4o4oCwKSIpICU+JQogIHNlbGVjdCgtYyhQcm9iZSwgZGVwdGhzKSkgJT4lCiAgZmlsdGVyKCFpcy5uYShmcmNfMTRjKSkKCiMgYWRkICcwOSBkYXRhCmRlbnMuMDEuMDkuMTkuZGYgPC0gcmJpbmQoCiAgZGVucy5kZiwgCiAgc3JhLmZyYy4xNGMgJT4lCiAgICBzZWxlY3QoLWx5cl9iZF9zYW1wKSkgJT4lCiAgbXV0YXRlKHBtID0gaWZlbHNlKFBNID09ICJBTiIsICJhbmRlc2l0ZSIsIAogICAgICAgICAgICAgICAgICAgICBpZmVsc2UoUE0gPT0gIkJTIiwgImJhc2FsdCIsICJncmFuaXRlIikpLAogICAgICAgICBlY28gPSBmYWN0b3IoaWZlbHNlKEVDTyA9PSAicHAiLCAid2FybSIsIGlmZWxzZShFQ08gPT0gIndmIiwgImNvb2wiLCAiY29sZCIpKSwKICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIndhcm0iLCAiY29vbCIsICJjb2xkIikpLAogICAgICAgICB5ZWFyID0gYXMubnVtZXJpYyhZZWFyKSwKICAgICAgICAgbWlkZGVwdGggPSBseXJfdG9wICsgKGx5cl9ib3QgLSBseXJfdG9wKSAvIDIpCmBgYAoKYGBgIHtyIHBsb3QtcHJvZmlsZXN9CiMgcHJvIHBsb3QgZngKZGVucy5wcm8ucC5meCA8LSBmdW5jdGlvbihkZiwgeWVhciwgbGVnLnBvcyA9ICJyaWdodCIpIHsKICAKICAjIGZpbHRlciBkZiBieSB5ZWFyCiAgZGYgPC0gZGZbZGYkeWVhciA9PSB5ZWFyLCBdCiAgCiAgIyBnZXQgYXRtIDE0QwogIGF0bS4xNGMgPC0gYXRtLjE0Y1thdG0uMTRjJHllYXIgPT0geWVhciArIC41LCAiZDE0YyJdCiAgCiAgIyBzZXQgc2hhcGUgdG8gMjAwMSBkZWZhdWx0cwogIHNocC52IDwtIGMoIndhcm0iID0gMTUsICJjb29sIiA9IDE3LCAiY29sZCIgPSAxNikKICBhbGYgPC0gMQogIGxudC52IDwtIGMoIjIwMDEiID0gMSkKICBzdHJva2UgPC0gMQogIGxuLnN6IDwtIC41CiAgCiAgIyBjaGFuZ2Ugc2hhcGUgYW5kIGFscGhhIGFzIG5lZWRlZAogIGlmICh5ZWFyID09IDIwMDkpIHsKICAgIGFsZiA8LSAuNgogICAgbG50LnYgPC0gYygiMjAwOSIgPSAyKQogIH0gZWxzZSBpZiAoeWVhciA9PSAyMDE5KSB7CiAgICBzaHAudiA8LSBjKCJ3YXJtIiA9IDAsICJjb29sIiA9IDIsICJjb2xkIiA9IDEpCiAgICBsbnQudiA8LSBjKCIyMDE5IiA9IDMpCiAgICBzdHJva2UgPC0gMS4yCiAgICBsbi5zeiA8LSAxCiAgfQogIAogICMgcGxvdCBmeAogIGdncGxvdChkZiwgYWVzKGZyY18xNGMsIGx5cl9ib3QsIGNvbG9yID0gZnJjKSkgKwogICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gYXRtLjE0YywgY29sb3IgPSAiZ3JheSIpICsKICAgIGdlb21fcG9pbnQoYWVzKHNoYXBlID0gZWNvKSwgc2l6ZSA9IDMsIGFscGhhID0gYWxmLCBzdHJva2UgPSBzdHJva2UpICsKICAgIGdlb21fcGF0aChhZXMobGluZXR5cGUgPSBZZWFyKSwgc2l6ZSA9IGxuLnN6KSArCiAgICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygibWluQyIgPSAiIzliMDAzZiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZlBPTSIgPSAiIzNmOWIwMCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib1BPTSIgPSAiIzAwNDdhZiIpKSArCiAgICBzY2FsZV9saW5ldHlwZV9tYW51YWwobmFtZSA9IE5VTEwsIHZhbHVlcyA9IGxudC52KSArCiAgICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9IE5VTEwsIHZhbHVlcyA9IHNocC52KSArCiAgICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKGVjbyksIGNvbHMgPSB2YXJzKHBtKSkgKwogICAgc2NhbGVfeV9yZXZlcnNlKCkgKwogICAgdGhlbWVfYncoKSArCiAgICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gbGVnLnBvcykKfQoKIyBwcm8gcGxvdCBmeApkZW5zLnByby5wLmZ4MiA8LSBmdW5jdGlvbihkZikgewogIAogIGdncGxvdChkZiwgYWVzKGZyY18xNGMsIG1pZGRlcHRoLCBjb2xvciA9IHBtKSkgKwogICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAyKSArCiAgICBnZW9tX3BvaW50KGFlcyhzaGFwZSA9IGVjbyksIHNpemUgPSAzKSArCiAgICBnZW9tX3BhdGgoKSArCiAgICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiYW5kZXNpdGUiID0gYW5kZXNpdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFzYWx0IiA9IGJhc2FsdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJncmFuaXRlIiA9IGdyYW5pdGUpKSArCiAgICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9IE5VTEwsIAogICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoIndhcm0iID0gMTUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29vbCIgPSAxNywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xkIiA9IDE2KSkgKwogICAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhlY28pLCBjb2xzID0gdmFycyhmcmMyKSkgKwogICAgc2NhbGVfeV9yZXZlcnNlKGxpbWl0cyA9IGMoMzAsIDApKSArCiAgICB0aGVtZV9idygpICsKICAgIHlsYWIoIkRlcHRoIChjbSkiKSArCiAgICB4bGFiKGV4cHJlc3Npb24oJ0ZyYWN0aW9uICcqRGVsdGEqJydeMTQqJyAo4oCwKScpKSArCiAgICBndWlkZXMoY29sb3IgPSBndWlkZV9sZWdlbmQobmNvbCA9IDMpLAogICAgICAgICAgIHNoYXBlID0gZ3VpZGVfbGVnZW5kKG5jb2wgPSAzKSkgKwogICAgdGhlbWVfYncoKSArCiAgICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLAogICAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksCiAgICAgICAgICBzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgc2l6ZSA9IDEyKSwKICAgICAgICAgIHN0cmlwLnRleHQueSA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCBhbmdsZSA9IDAsIHNpemUgPSAxMiksCiAgICAgICAgICBzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAid2hpdGUiLCBjb2xvciA9ICJ3aGl0ZSIpLAogICAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsCiAgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpKSAKfQpgYGAKCmBgYHtyIHBsb3QtZGVucy1wcm9zfQojIHBsb3QgcHJvZmlsZXMgYnkgeWVhciBhbmQgZnJhY3Rpb24gdHlwZQpkZW5zLnByby5wLmZ4KGRlbnMuMDEuMDkuMTkuZGYsIDIwMDEpCmRlbnMucHJvLnAuZngoZGVucy4wMS4wOS4xOS5kZiwgMjAxOSkKZGVucy5wcm8ucC5meChkZW5zLjAxLjA5LjE5LmRmLCAyMDA5KQogICAgICAKZGVucy4wMS4wOS4xOS5wbG90LmRmIDwtIGRlbnMuMDEuMDkuMTkuZGYgJT4lCiAgZmlsdGVyKGx5cl9ib3QgPCAzMSkgJT4lCiAgbXV0YXRlKGZyYzIgPSBpZmVsc2UoZnJjID09ICJmUE9NIiwgImZyZWUgbGlnaHQiLCBpZmVsc2UoZnJjID09ICJvUE9NIiwgIm9jY2x1ZGVkIGxpZ2h0IiwgImhlYXZ5IikpKQpkZW5zLjAxLjA5LjE5LnBsb3QuZGYgPC0gZGVucy4wMS4wOS4xOS5wbG90LmRmW2RlbnMuMDEuMDkuMTkucGxvdC5kZiRmcmMgIT0gIm9QT00iICYgZGVucy4wMS4wOS4xOS5wbG90LmRmJHllYXIgPT0gMjAxOSwgXQoKZGVucy5wcm8ucC5meDIoZGVucy4wMS4wOS4xOS5wbG90LmRmKQpgYGAKCiMjIFNwbGluZSAnMDEsICcwOQojIyMgU3BsaW5lIEMKCmBgYHtyIHNwbGluZS1jLWRhdGF9CiMgc3BsaW5lIGZpdCBmeHMgZm9yIGZyYWN0aW9uIFNPQyBzdG9ja3MKIyMgTWFzcyBwcmVzZXJ2aW5nIHNwbGluZSAocXVhZHJhdGljKQptcHNwbGluZS5mcmMuZnggPC0gZnVuY3Rpb24oZnJjLmRmKSB7CiAgCiAgIyBzcGxpdCBieSBmcmMgYW5kIFBNZWNvIHRvIGZpdCBzcGxpbmVzIHRvIHByb2ZpbGVzCiAgbGFwcGx5KAogICAgc3BsaXQoZnJjLmRmLCBmcmMuZGYkZnJjKSwgZnVuY3Rpb24oZGYpIHsKICAgICAgbGFwcGx5KHNwbGl0KGRmLCBkZiRQTWVjbyksIGZ1bmN0aW9uKHgpIHsKICAgICAgICAKICAgICAgICAjIGNoZWNrIGZvciBzaW5nbGUgb2JzIGRhdGEKICAgICAgICBpZiAobnJvdyh4KSA+IDEpIHsKICAgICAgICAgIAogICAgICAgICAgIyBtYWtlIHN1cmUgdG8gb3JkZXIgZGF0YQogICAgICAgICAgeCA8LSB4W29yZGVyKHgkbHlyX2JvdCksIF0gCiAgICAgICAgICAKICAgICAgICAgICMgY2FsY3VsYXRlIGN1bXVsYXRpdmUgQyBtYXNzCiAgICAgICAgICB4JG1hc3NfY19jbXR2IDwtIE5BCiAgICAgICAgICBmb3IoaSBpbiBzZXFfYWxvbmcoeCRseXJfYm90KSkgewogICAgICAgICAgICBpZihpID09IDEpIHsKICAgICAgICAgICAgICB4JG1hc3NfY19jbXR2W2ldIDwtIHgkbWFzc19jX2dbaV0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB4JG1hc3NfY19jbXR2W2ldIDwtIHgkbWFzc19jX2dbaV0gKyB4JG1hc3NfY19jbXR2W2ktMV0gCiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgIyBjb252ZXJ0IHRvIHNvaWwgcHJvZmlsZSBjb2xsZWN0aW9uIG9iaiBhbmQgcnVuIG1wc3BsaW5lCiAgICAgICAgICBkZXB0aHMoeCkgPC0gUE1lY28gfiBseXJfdG9wICsgbHlyX2JvdAogICAgICAgICAgeC5tcHMgPC0gc3VwcHJlc3NNZXNzYWdlcygKICAgICAgICAgICAgbXBzcGxpbmUoeCwgdmFyLm5hbWUgPSAibWFzc19jX2NtdHYiLCBzaG93LnByb2dyZXNzID0gRkFMU0UpKQogICAgICAgICAgCiAgICAgICAgICAjIGV4dHJhY3QgMSBjbSBpbmNyZW1lbnQgZGF0YQogICAgICAgICAgaXggPC0gd2hpY2goIWlzLm5hKHgubXBzJHZhci4xY20pKQogICAgICAgICAgZGYgPC0gZGF0YS5mcmFtZShtaWRkZXB0aCA9IHNlcSgxLCBsZW5ndGgoaXgpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbHlyX3NvYyA9IHgubXBzJHZhci4xY21baXhdKQogICAgICAgICAgCiAgICAgICAgICAjIGNoZWNrIGZvciBOQSB2YWx1ZXMgdXAgdG8gMzAgY20KICAgICAgICAgIGlmIChsZW5ndGgoaXgpIDwgMzEpIHsKICAgICAgICAgICAgIyBjb252ZXJ0IHRvIGNsYXNzICJzcGxpbmUiIHdpdGggc21vb3RoLnNwbGluZSBmeG4KICAgICAgICAgICAgc3Auc3MgPC0gc21vb3RoLnNwbGluZShkZikKICAgICAgICAgIAogICAgICAgICAgICAjIHByZWRpY3QgZm9yIE5BIHZhbHVlcyB1cCB0byAzMSBjbSAobGluZWFyIGJleW9uZCBsYXN0IG1lYXN1cmVkIGRlcHRoKQogICAgICAgICAgICBzdGQgPC0gc2VxKDAsIDMwKSAjIGluIGNtIAogICAgICAgICAgICBzcCA8LSBwcmVkaWN0KHNwLnNzLCBzdGQpIAogICAgICAgICAgICBkZiA8LSBkYXRhLmZyYW1lKHNwKQogICAgICAgICAgICBjb2xuYW1lcyhkZikgPC0gYygibWlkZGVwdGgiLCJseXJfc29jIikgCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgICMgcmV0dXJuCiAgICAgICAgICByZXR1cm4oZGYpCiAgICAgICAgfQogICAgICB9KQogICAgfSkKfQoKIyMgZGVwdGggc3BsaW5lIGFsdGVybmF0aXZlIChsaW5lYXIgZm9yIHR3byBpbmNyZW1lbnQgZml0cy4uLikKU09Dc3BsaW5lLmZ4IDwtIGZ1bmN0aW9uKGZyYy5kZikgewogIAogICMgc3BsaXQgYnkgZnJjIGFuZCBQTWVjbyB0byBmaXQgc3BsaW5lcyB0byBwcm9maWxlcwogIGxhcHBseSgKICAgIHNwbGl0KGZyYy5kZiwgZnJjLmRmJGZyYyksIGZ1bmN0aW9uKGRmKSB7CiAgICAgIGxhcHBseShzcGxpdChkZiwgZGYkUE1lY28pLCBmdW5jdGlvbih4KSB7CiAgICAKICAgICAgICAjIGNoZWNrIGZvciBzaW5nbGUgb2JzIGRhdGEKICAgICAgICBpZiAobnJvdyh4KSA+IDEpIHsKICAgICAgICAgIAogICAgICAgICAgIyBtYWtlIHN1cmUgdG8gb3JkZXIgZGF0YQogICAgICAgICAgeCA8LSB4W29yZGVyKHgkbHlyX2JvdCksIF0gCiAgICAgICAgICAKICAgICAgICAgICMgY2FsY3VsYXRlIGN1bXVsYXRpdmUgQyBtYXNzCiAgICAgICAgICB4JG1hc3NfY19jbXR2IDwtIE5BCiAgICAgICAgICBmb3IoaSBpbiBzZXFfYWxvbmcoeCRseXJfYm90KSkgewogICAgICAgICAgICBpZihpID09IDEpIHsKICAgICAgICAgICAgICB4JG1hc3NfY19jbXR2W2ldIDwtIHgkbWFzc19jX2dbaV0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB4JG1hc3NfY19jbXR2W2ldIDwtIHgkbWFzc19jX2dbaV0gKyB4JG1hc3NfY19jbXR2W2ktMV0gCiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgIyBmaXQgbW9ub3RvbmljIGN1YmljIHNwbGluZQogICAgICAgICAgc3AgPC0gc3BsaW5lKHhbICwgYygibWlkZGVwdGgiLCAibWFzc19jX2NtdHYiKV0sIG1ldGhvZCA9ICJoeW1hbiIpIAogICAgICAgICAgCiAgICAgICAgICAjIGNvbnZlcnQgdG8gY2xhc3MgInNwbGluZSIgd2l0aCBzbW9vdGguc3BsaW5lIGZ4bgogICAgICAgICAgc3Auc3MgPC0gc21vb3RoLnNwbGluZShzcCkgCiAgICAgICAgICAKICAgICAgICAgICMgcHJlZGljdCAxIGNtIGluY3JlbWVudHMgdG8gMzAgY20gKGxpbmVhciBiZXlvbmQgbGFzdCBtZWFzdXJlZCBkZXB0aCkKICAgICAgICAgIHN0ZCA8LSBzZXEoMCwgMzApICMgaW4gY20gCiAgICAgICAgICBzcCA8LSBwcmVkaWN0KHNwLnNzLCBzdGQpIAogICAgICAgICAgZGYgPC0gZGF0YS5mcmFtZShzcCkKICAgICAgICAgIGNvbG5hbWVzKGRmKSA8LSBjKCJtaWRkZXB0aCIsImx5cl9zb2MiKSAKICAgICAgICAgIAogICAgICAgICAgIyByZXR1cm4gCiAgICAgICAgICByZXR1cm4oZGYpCiAgICAgICAgfQogICAgICB9KQogICAgfSkKfQpgYGAKCmBgYHtyIHJ1bi1jc3BsaW5lLWZyY30KIyBmcmFjdGlvbiBDIHN0b2Nrcwpzb2MuMjAwOS5mcmNTT0Muc3AgPC0gbXBzcGxpbmUuZnJjLmZ4KHNyYS4wOS5seXIuQykKc29jLjIwMDEuZnJjU09DLnNwIDwtIG1wc3BsaW5lLmZyYy5meChzcmEuZnJjLm1zcy5DLjAxLmRmKQpzb2MuMjAwMS5mcmNTT0Muc3AuZGYgPC0gbGFwcGx5KHNvYy4yMDAxLmZyY1NPQy5zcCwgZnVuY3Rpb24obHMpCiAgbGFwcGx5KGxzLCBmdW5jdGlvbihkZikgewogICAgIyBzdW1tYXJpemUgZm9yIHRhcmdldCBpbnRlcnZhbHMKICAgICAgICBkZiA8LSBkYXRhLmZyYW1lKAogICAgICAgICAgbHlyX2JvdCA9IGMoMTAsIDIwLCAzMCksCiAgICAgICAgICBseXJfc29jX2NtdHYgPSBjKGRmWzEwLCAibHlyX3NvYyJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICBkZlsyMCwgImx5cl9zb2MiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZGZbMzAsICJseXJfc29jIl0pKQogICAgICAgIGRmJGx5cl9zb2MgPC0gTkEKICAgICAgICBmb3IgKGkgaW4gc2VxX2Fsb25nKGRmJGx5cl9ib3QpKSB7CiAgICAgICAgICBpZihpID09IDEpIHsKICAgICAgICAgICAgICBkZiRseXJfc29jW2ldIDwtIGRmJGx5cl9zb2NfY210dltpXQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGRmJGx5cl9zb2NbaV0gPC0gZGYkbHlyX3NvY19jbXR2W2ldIC0gZGYkbHlyX3NvY19jbXR2W2kgLSAxXSAKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICByZXR1cm4oZGZbICwgYygibHlyX2JvdCIsICJseXJfc29jIildKQogIH0pKQoKdGVzdCA8LSBzcmEuZnJjLm1zcy5DLjAxLmRmICU+JSAKICBTT0NzcGxpbmUuZngKCiMgTWVhc3VyZWQgU09DIGFzIGxzCnNyYS5mcmMubXNzLkMuMDEubHMgPC0gbGFwcGx5KAogIHNwbGl0KHNyYS5mcmMubXNzLkMuMDEuZGYsIHNyYS5mcmMubXNzLkMuMDEuZGYkZnJjKSwgZnVuY3Rpb24oZGYpCiAgICBzcGxpdChkZiwgZGYkUE1lY28pKQoKIyBtYWtlIHNwbGluZSBsaXN0cyBzaW1pbGFyIGZvciBwbG90dGluZyB0b2dldGhlcgpmcmMucG1lY28uZnggPC0gZnVuY3Rpb24oc29jX2xzLCBuYW1lKSB7CiAgICBsYXBwbHkoc2VxX2Fsb25nKHNvY19scyksIGZ1bmN0aW9uKGopCiAgICAgIGxhcHBseShzZXFfYWxvbmcoc29jX2xzW1tqXV0pLCBmdW5jdGlvbihpKSB7CiAgICAgICAgUE1lY28gPC0gbmFtZXMoc29jX2xzW1tqXV0pW2ldCiAgICAgICAgaWYgKCFpcy5kYXRhLmZyYW1lKHNvY19sc1tbal1dW1tpXV0pKSB7CiAgICAgICAgICBseXJfc29jIDwtIHNvY19sc1tbal1dW1tpXV0KICAgICAgICAgIGRmIDwtIGRhdGEuZnJhbWUobWlkZGVwdGggPSBzZXEoMSwgbGVuZ3RoKGx5cl9zb2MpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbHlyX3NvYyA9IGx5cl9zb2MpCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGRmIDwtIHNvY19sc1tbal1dW1tpXV0KICAgICAgICB9CiAgICAgICAgIyBhZGQgbmFtZSBhbmQgcmV0dXJuCiAgICAgICAgZGYgJT4lCiAgICAgICAgICBtdXRhdGUoaWQgPSBuYW1lLAogICAgICAgICAgICAgICAgIFBNZWNvID0gUE1lY28sCiAgICAgICAgICAgICAgICAgZnJjID0gbmFtZXMoc29jX2xzKVtqXSkKICAgICAgfSkpCiAgfQogIAojIHJ1biBmeApsczEgPC0gZnJjLnBtZWNvLmZ4KHRlc3QsICJzcCIpCmxzMiA8LSBmcmMucG1lY28uZngoc29jLjIwMDEuZnJjU09DLnNwLCAibXBzcGxpbmUiKQogIAojIGNvbWJpbmUgbGlzdHMKbHMxMiA8LSBsYXBwbHkoc2VxX2Fsb25nKGxzMSksIGZ1bmN0aW9uKGkpCiAgYmluZF9yb3dzKAogICAgbGFwcGx5KHNlcV9hbG9uZyhsczFbW2ldXSksIGZ1bmN0aW9uKGopCiAgICAgIHJiaW5kKGxzMVtbaV1dW1tqXV0sIGxzMltbaV1dW1tqXV0pCiAgICAgICksIC5pZCA9ICJQTWVjbyIpICU+JQogICAgbXV0YXRlKFBNZWNvID0gZmFjdG9yKFBNZWNvLCBsYWJlbHMgPSB1bmlxdWUoc3JhLmZyYy5tc3MuQy4wMS5kZiRQTWVjbykpKSkKCiMgY2FsY3VsYXRlIGN1bXVsYXRpdmUgQyBtYXNzCnNyYS5mcmMubXNzLkMuMDEubHMyIDwtIGxhcHBseShzcmEuZnJjLm1zcy5DLjAxLmxzLCBmdW5jdGlvbihscykgewogIGxhcHBseShscywgZnVuY3Rpb24oZGYpIHsKICAgIGRmJG1hc3NfY19jbXR2IDwtIE5BCiAgICBmb3IoaSBpbiBzZXFfYWxvbmcoZGYkbHlyX2JvdCkpIHsKICAgICAgaWYoaSA9PSAxKSB7CiAgICAgICAgZGYkbWFzc19jX2NtdHZbaV0gPC0gZGYkbWFzc19jX2dbaV0KICAgICAgfSBlbHNlIHsKICAgICAgICBkZiRtYXNzX2NfY210dltpXSA8LSBkZiRtYXNzX2NfZ1tpXSArIGRmJG1hc3NfY19jbXR2W2kgLSAxXSAKICAgICAgfQogICAgfQogICAgcmV0dXJuKGRmKQogIH0pCn0pCgojIGFkZCBhZGRpdGlvbmFsIDAgbWVhc3VyZW1lbnQgZm9yIHN0ZXAgcGxvdApzcmEuZnJjLm1zcy5DLjAxLmxzMyA8LSBsYXBwbHkoc3JhLmZyYy5tc3MuQy4wMS5sczIsIGZ1bmN0aW9uKGxzKQogIGJpbmRfcm93cyhsYXBwbHkobHMsIGZ1bmN0aW9uKGRmKSB7CiAgICB4IDwtIGRmW3doaWNoKGRmJGx5cl9ib3QgPT0gbWluKGRmJGx5cl9ib3QpKSwgXQogICAgeCRseXJfYm90IDwtIDAKICAgIHJiaW5kKHgsIGRmKQogIH0pKQopCgojIGJpbmQgcm93cyBvZiBzdWJsaXN0CnNyYS5mcmMubXNzLkMuMDEubHM0IDwtIGxhcHBseShzcmEuZnJjLm1zcy5DLjAxLmxzMiwgZnVuY3Rpb24obHMpIGJpbmRfcm93cyhscykpCgojIGFkZCBtZWFzdXJlZCBkYXRhIHRvIGRmMTIgYW5kIHBsb3QKcC5scyA8LSBsYXBwbHkoc2VxX2Fsb25nKGxzMTIpLCBmdW5jdGlvbihpKSB7CiAgZnJjIDwtIGxzMTJbW2ldXVtbImZyYyJdXQogIGxzMTJbW2ldXSAlPiUKICAgIG11dGF0ZShQTSA9IHN1YnN0cihQTWVjbywgMSwgMiksCiAgICAgICAgICAgRUNPID0gc3Vic3RyKFBNZWNvLCAzLCA0KSkgJT4lCiAgICBnZ3Bsb3QoLiwgYWVzKGx5cl9zb2MsIG1pZGRlcHRoLCBjb2xvciA9IFBNKSkgKwogICAgZ2VvbV9zdGVwKGRhdGEgPSBzcmEuZnJjLm1zcy5DLjAxLmxzM1tbaV1dLAogICAgICAgICAgICAgIGFlcyhtYXNzX2NfY210diwgbHlyX2JvdCkpICsKICAgIGdlb21fcGF0aChhZXMobGluZXR5cGUgPSBpZCkpICsKICAgIGdlb21fcG9pbnQoZGF0YSA9IHNyYS5mcmMubXNzLkMuMDEubHM0W1tpXV0sCiAgICAgICAgICAgICAgIGFlcyhtYXNzX2NfY210diwgbWlkZGVwdGgpKSArCiAgICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiQU4iID0gYW5kZXNpdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQlMiID0gYmFzYWx0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdSIiA9IGdyYW5pdGUpKSArICAgICAgCiAgICBzY2FsZV95X3JldmVyc2UoKSArCiAgICBmYWNldF9ncmlkKGNvbHMgPSB2YXJzKFBNKSwgcm93cyA9IHZhcnMoRUNPKSkgKwogICAgZ2d0aXRsZShmcmMpICsKICAgIHRoZW1lX2J3KCkgKwogICAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkKfSkKCiMgcGxvdApwLmxzCmBgYAoKYGBge3IgY29tYmluZS1mcG9tLW9wb219CiMgY29tYmluZSBmUE9NIGFuZCBvUE9NIGZvciAiUE9NIiBmcmFjdGlvbgpzb2MuMjAwMS5QT00uc3AuZGYgPC0gYmluZF9yb3dzKG1hcHBseSgKICBtZXJnZSwKICBzb2MuMjAwMS5mcmNTT0Muc3AuZGYkRlBPTSwKICBzb2MuMjAwMS5mcmNTT0Muc3AuZGYkT1BPTSwKICBNb3JlQXJncyA9IGxpc3QoYnkgPSAibHlyX2JvdCIsIHN1ZmZpeGVzID0gYygiX2ZQT00iLCAiX29QT00iKSksCiAgU0lNUExJRlkgPSBGQUxTRSksIC5pZCA9ICJQTWVjbyIpCnNvYy4yMDAxLlBPTS5zcC5kZiRzb2NfUE9NIDwtIHJvd1N1bXMoCiAgc29jLjIwMDEuUE9NLnNwLmRmWyAsIGMoImx5cl9zb2NfZlBPTSIsICJseXJfc29jX29QT00iKV0pCnBvbS5jLjAxLmRmIDwtIHBpdm90X2xvbmdlcigKICBzb2MuMjAwMS5QT00uc3AuZGYsIAogIGNvbHMgPSBzdGFydHNfd2l0aCgibHlyX3NvYyIpLAogIG5hbWVzX3RvID0gImZyYyIsCiAgbmFtZXNfcHJlZml4ID0gImx5cl9zb2NfIiwKICB2YWx1ZXNfdG8gPSAic29jX2ZyYyIpCnBvbS5jLjAxLmRmJGNfUE9NX2ZyYyA8LSBwb20uYy4wMS5kZiRzb2NfZnJjIC8gcG9tLmMuMDEuZGYkc29jX1BPTQpgYGAKCiMjIyBTcGxpbmUgMTRDCgpgYGB7ciBzcGxpbmUtMTRDLWZyY30KIyBydW4gbXBzcGxpbmUgb24gZnJhY3Rpb24gbW9kZXJuIGRhdGEgZm9yICcwMSwgJzA5CmRlbnMuMDEuMDkuZGYgPC0gZGVucy4wMS4wOS4xOS5kZlt3aGljaChkZW5zLjAxLjA5LjE5LmRmJHllYXIgIT0gMjAxOSksIF0KZGVucy4wMS4wOS5kZiRmcmMgPC0gZmFjdG9yKGRlbnMuMDEuMDkuZGYkZnJjLCBsZXZlbHMgPSBjKCJmUE9NIiwgIm9QT00iLCAibWluQyIpKQpkZW5zLjAxLjA5LmxzLnNwIDwtIGxhcHBseSgKICBzcGxpdChkZW5zLjAxLjA5LmRmLCBkZW5zLjAxLjA5LmRmJGZyYyksIGZ1bmN0aW9uKGRmKSB7CiAgICBsYXBwbHkoc3BsaXQoZGYsIGRmJHByb19uYW1lKSwgZnVuY3Rpb24oeCkgewogICAgICBpZiAobGVuZ3RoKHdoaWNoKCFpcy5uYSh4JEYxNEMpKSkgPiAxKSB7CiAgICAgICBkZXB0aHMoeCkgPC0gcHJvX25hbWUgfiBseXJfdG9wICsgbHlyX2JvdAogICAgICAgIHgubXBzIDwtIHN1cHByZXNzTWVzc2FnZXMoCiAgICAgICAgICBtcHNwbGluZSh4LCB2YXIubmFtZSA9ICJGMTRDIiwgc2hvdy5wcm9ncmVzcyA9IEZBTFNFKSkKICAgICAgICB4Lm1wcyR2YXIuMWNtIDwtIHgubXBzJHZhci4xY21bMTozMF0KICAgICAgICAKICAgICAgICAjIGZpbGwgTkEgdy8gc21vb3RoLnNwbGluZSBwcmVkaWN0aW9uIChsaW5lYXIpCiAgICAgICAgaXggPC0gd2hpY2goaXMubmEoeC5tcHMkdmFyLjFjbSkpCiAgICAgICAgaWYgKGxlbmd0aChpeCkgPiAwKSB7CiAgICAgICAgICBzcC5zcyA8LSBzbW9vdGguc3BsaW5lKHgubXBzJHZhci4xY21bLWl4XSkKICAgICAgICAgIHNwIDwtIHByZWRpY3Qoc3Auc3MsIGl4KQogICAgICAgICAgeC5tcHMkdmFyLjFjbVtpeF0gPC0gc3AkeQogICAgICAgIH0KICAgICAgICByZXR1cm4oeC5tcHMpIAogICAgICB9CiAgICB9KQogIH0pCmRlbnMuMDEuMDkubHMuc3AgPC0gbGFwcGx5KGRlbnMuMDEuMDkubHMuc3AsIGZ1bmN0aW9uKGxzKSB7CiAgbmFtZXMobHMpIDwtIGlmZWxzZShncmVwbCgiMjAxMCIsIG5hbWVzKGxzKSksIHN1YigiMjAxMCIsICIyMDA5IiwgbmFtZXMobHMpKSwgbmFtZXMobHMpKQogIHJldHVybihscykKfSkKYGBgCgpgYGB7ciBwbG90LWZyYy1mbS1zcGxpbmVzfQojIHBsb3QgZm9yIGRldGVybWluaW5nIGJlc3QgZXh0cmFwb2xhdGlvbiBmeApmcmMuZm0uc3AucGxvdC5meCA8LSBmdW5jdGlvbihmbS5zcC5scykgewogIGxhcHBseShmbS5zcC5scywgZnVuY3Rpb24obHMpIHsKICAgIHAgPC0gYmluZF9yb3dzKGxhcHBseShzZXFfYWxvbmcobHMpLCBmdW5jdGlvbihpKSB7CiAgICAgIGlmICghaXMubnVsbChsc1tbaV1dKSkgewogICAgICAgIGRmIDwtIGRhdGEuZnJhbWUodChkby5jYWxsKHJiaW5kLCBsaXN0KGxzW1tpXV1bWzFdXSwgbHNbW2ldXVtbNF1dKSkpKQogICAgICAgIGRmJG1pZGRlcHRoIDwtIHNlcSgxLCBsZW5ndGgoZGZbICwgMV0pKQogICAgICAgIGRmJFBNIDwtIHN1YnN0cihkZlsgLCAxXSwgMSwgMikKICAgICAgICBkZiRFQ08gPC0gc3Vic3RyKGRmWyAsIDFdLCAzLCA0KQogICAgICAgIGRmJFllYXIgPC0gaWZlbHNlKHN1YnN0cihkZlsgLCAxXSwgNiwgOSkgPT0gIjIwMTAiLCAiMjAwOSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic3RyKGRmWyAsIDFdLCA2LCA5KSkKICAgICAgICBjb2xuYW1lcyhkZilbMl0gPC0gImZtIgogICAgICAgIGRmJGZtIDwtIGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGRmJGZtKSkKICAgICAgICByZXR1cm4oZGZbICwgLTFdKQogICAgICB9CiAgICB9KSkgJT4lCiAgICBnZ3Bsb3QoLiwgYWVzKGZtLCBtaWRkZXB0aCwgY29sb3IgPSBQTSwgbGluZXR5cGUgPSBZZWFyKSkgKwogICAgZ2VvbV9wYXRoKCkgKwogICAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoIkFOIiA9IGFuZGVzaXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJTIiA9IGJhc2FsdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHUiIgPSBncmFuaXRlKSkgKwogICAgc2NhbGVfbGluZXR5cGVfbWFudWFsKG5hbWUgPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoIjIwMDEiID0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyMDA5IiA9IDIpKSArCiAgICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYyguNzUsIDEuMjUpKSArCiAgICBzY2FsZV95X3JldmVyc2UoKSArCiAgICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKEVDTyksIGNvbHMgPSB2YXJzKFBNKSkgKwogICAgdGhlbWVfYncoKSArCiAgICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpKQogIH0pCn0KZGVucy4wMS4wOS5scy5zcC5wIDwtIGZyYy5mbS5zcC5wbG90LmZ4KGRlbnMuMDEuMDkubHMuc3ApCmBgYAoKIyMjIEMtd2VpZ2h0ZWQgMTRDIHNwbGluZQoKYGBge3IgY3d0LTE0Y30KIyBmcmFjdGlvbnMKY3d0LmZyYy5meCA8LSBmdW5jdGlvbihzb2MubHMpIHsKICBsYXBwbHkoc29jLmxzLCBmdW5jdGlvbihwcm9fbHMpIHsKICAgIGxhcHBseShwcm9fbHMsIGZ1bmN0aW9uKHNvYykgewogICAgICBkIDwtIHNlcSgxMCwgMzAsIDEwKQogICAgICBjIDwtIHZlY3Rvcihtb2RlID0gImxpc3QiLCBsZW5ndGggPSBsZW5ndGgoZCkpCiAgICAgIGZvcihqIGluIHNlcV9hbG9uZyhkKSkgewogICAgICAgIGlmKGogPT0gMSkgewogICAgICAgICAgIyBmaXJzdCBkZXB0aCBpbmNyZW1lbnQKICAgICAgICAgIGNbW2pdXSA8LSBzb2NbMTpkW2pdLCAibHlyX3NvYyJdCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICMgZm9sbG93aW5nIGRlcHRoIGluY3JlbWVudHMKICAgICAgICAgIGNbW2pdXSA8LSBzb2NbKGRbai0xXSsxKTpkW2pdLCAibHlyX3NvYyJdIAogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4odW5saXN0KGxhcHBseShjLCBmdW5jdGlvbih4KSB4IC8gc3VtKHgsIG5hLnJtID0gVFJVRSkpKSkKICAgIH0pCiAgfSkKfQoKIyAyMDAxCmN3dC4xOS4wMS5mcmMgPC0gY3d0LmZyYy5meChzb2MuMjAwMS5mcmNTT0Muc3ApCgojIDIwMDkKY3d0LjE5LjA5LmZyYyA8LSBjd3QuZnJjLmZ4KHNvYy4yMDA5LmZyY1NPQy5zcCkKCiMgY29tYmluZQpjd3QuMTkuMDEuMDkuZnJjIDwtIGxhcHBseShzZXFfYWxvbmcoY3d0LjE5LjAxLmZyYyksIGZ1bmN0aW9uKGkpIHsKICBscy4wMSA8LSBjd3QuMTkuMDEuZnJjW1tpXV0KICBuYW1lcyhscy4wMSkgPC0gcGFzdGUwKG5hbWVzKGN3dC4xOS4wMS5mcmNbW2ldXSksICJfMjAwMSIpCiAgbHMuMDkgPC0gY3d0LjE5LjA5LmZyY1tbaV1dCiAgbmFtZXMobHMuMDkpIDwtIHBhc3RlMChuYW1lcyhjd3QuMTkuMDkuZnJjW1tpXV0pLCAiXzIwMDkiKQogIGxzIDwtIGMobHMuMDEsIGxzLjA5KQogIGxzW29yZGVyKG5hbWVzKGxzKSldCn0pCm5hbWVzKGN3dC4xOS4wMS4wOS5mcmMpIDwtIG5hbWVzKGN3dC4xOS4wMS5mcmMpCgojIyBjYWxjdWxhdGUgZm1fd3RzCiMjICcxOSBkZXB0aHMKZm0ud3RkLjE5LjAxLjA5IDwtIGxhcHBseShzZXFfYWxvbmcoZGVucy4wMS4wOS5scy5zcCksIGZ1bmN0aW9uKGkpIHsKICAKICAjIHJ1biBmeCBvbiBub24tbnVsbCBlbGVtZW50cwogIGZtLmxzIDwtIGxhcHBseShzZXFfYWxvbmcoZGVucy4wMS4wOS5scy5zcFtbaV1dKSwgZnVuY3Rpb24oaikgewogICAgCiAgICBpZiAoIWlzLm51bGwoZGVucy4wMS4wOS5scy5zcFtbaV1dW1tqXV0pKSB7CiAgICAgIAogICAgICAjIGNvbWJpbmUgY3d0LCBmbQogICAgICBkZiA8LSBkYXRhLmZyYW1lKGN3dCA9IGN3dC4xOS4wMS4wOS5mcmNbW2ldXVtbal1dLCAKICAgICAgICAgICAgICAgICAgICAgICBmbSA9IGRlbnMuMDEuMDkubHMuc3BbW2ldXVtbal1dW1sidmFyLjFjbSJdXSkKICAgICAgICAgICAgCiAgICAgICMgY2FsY3VsYXRlIHd0ZCBmbQogICAgICBkZiRmbV93dCA8LSBkZiRjd3QgKiBkZiRmbQogICAgICAKICAgICAgIyBzdW1tYXJpemUgZm9yIHRhcmdldCBpbnRlcnZhbHMKICAgICAgZGF0YS5mcmFtZSgKICAgICAgICBseXJfYm90ID0gYygxMCwgMjAsIDMwKSwKICAgICAgICBmbSA9IGMoCiAgICAgICAgICBzdW0oZGZbMToxMCwgImZtX3d0Il0pLCAKICAgICAgICAgIHN1bShkZlsxMToyMCwgImZtX3d0Il0pLCAKICAgICAgICAgIHN1bShkZlsyMTozMCwgImZtX3d0Il0pKSkgCiAgICB9CiAgfSkKICAKICAjIHJlc3RvcmUgbmFtZXMKICBuYW1lcyhmbS5scykgPC0gbmFtZXMoZGVucy4wMS4wOS5scy5zcFtbaV1dKQogICAgCiAgIyByZXR1cm4gd3RkIGZtIGxpc3QKICByZXR1cm4oZm0ubHMpCn0pCm5hbWVzKGZtLnd0ZC4xOS4wMS4wOSkgPC0gbmFtZXMoZGVucy4wMS4wOS5scy5zcCkKYGBgCgpgYGB7ciBwcmVwLWN3dC0xNGMtcGxvdH0KIyBtYWtlIGRmIGZvciBzcGxpbmVkICcwMSBkYXRhCmRlbnMuMDEuMDkuZGYgPC0gYmluZF9yb3dzKAogIGxhcHBseShmbS53dGQuMTkuMDEuMDksIGZ1bmN0aW9uKGxzKSAKICAgIGJpbmRfcm93cyhscywgLmlkID0gIlBNZWNvX3llYXIiKSksIC5pZCA9ICJmcmMiKSAlPiUKICBtdXRhdGUoUE1lY28gPSBzdWJzdHIoUE1lY29feWVhciwgMSwgNCksCiAgICAgICAgIHBtID0gaWZlbHNlKHN1YnN0cihQTWVjb195ZWFyLCAxLCAyKSA9PSAiQU4iLCAiYW5kZXNpdGUiLCAKICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHN1YnN0cihQTWVjb195ZWFyLCAxLCAyKSA9PSAiQlMiLCAiYmFzYWx0IiwgImdyYW5pdGUiKSksIAogICAgICAgICBlY28gPSBmYWN0b3IoCiAgICAgICAgICAgaWZlbHNlKHN1YnN0cihQTWVjb195ZWFyLCAzLCA0KSA9PSAicHAiLCAid2FybSIsIAogICAgICAgICAgICAgICAgICBpZmVsc2Uoc3Vic3RyKFBNZWNvX3llYXIsIDMsIDQpID09ICJ3ZiIsICJjb29sIiwgImNvbGQiKSksCiAgICAgICAgICAgbGV2ZWxzID0gYygid2FybSIsICJjb29sIiwgImNvbGQiKSksCiAgICAgICAgIHllYXIgPSBpZmVsc2UoZ3JlcGwoIjIwMDEiLCBQTWVjb195ZWFyKSwgMjAwMSwgMjAwOSksCiAgICAgICAgIFllYXIgPSBhcy5jaGFyYWN0ZXIoeWVhciksCiAgICAgICAgIGZyY18xNGMgPSBjb252ZXJ0X2ZtX2QxNGMoZm0gPSBmbSwgb2JzX2RhdGVfeSA9IHllYXIsIHZlcmJvc2UgPSBGQUxTRSksCiAgICAgICAgIGZyYyA9IGZhY3RvcihmcmMsIGxldmVscyA9IGMoImZQT00iLCAib1BPTSIsICJtaW5DIikpKSAlPiUKICByZW5hbWUoRjE0QyA9IGZtKSAlPiUKICBzZWxlY3QoLVBNZWNvX3llYXIpCgojIGNvbWJpbmUgJzAxLCAnMTkgZGF0YTsgcm0gTkEKZGVucy4wMS4wOS4xOS5zcC5kZiA8LSByYmluZCgKICBkZW5zLjAxLjA5LmRmLAogIGRlbnMuMDEuMDkuMTkuZGZbZGVucy4wMS4wOS4xOS5kZiR5ZWFyID09IDIwMTkgJiBkZW5zLjAxLjA5LjE5LmRmJGx5cl9ib3QgPCAzMSwgbmFtZXMoZGVucy4wMS4wOS4xOS5kZikgJWluJSBuYW1lcyhkZW5zLjAxLjA5LmRmKV0pICU+JQogIGZpbHRlcighaXMubmEoZnJjXzE0YykpCgojIGFkZCBQTWVjb19kZXB0aCBjb2wKZGVucy4wMS4wOS4xOS5zcC5kZiRQTWVjb19kZXB0aCA8LSBwYXN0ZTAoc3Vic3RyKGRlbnMuMDEuMDkuMTkuc3AuZGYkUE1lY28sIDEsIDQpLCAiXyIsIGRlbnMuMDEuMDkuMTkuc3AuZGYkbHlyX2JvdCAtIDEwLCAiLSIsIGRlbnMuMDEuMDkuMTkuc3AuZGYkbHlyX2JvdCkKCiMgc2F2ZQpzYXZlKGRlbnMuMDEuMDkuMTkuc3AuZGYsIGZpbGUgPSAiZGVucy4wMS4wOS4xOS5zcC5kZi5SRGF0YSIpCgojIHBsb3QgZmMKcGxvdC5kMTRjLnRzLmZ4IDwtIGZ1bmN0aW9uKGRmLCBjb21wYXJlX3ZhcikgewogIAogICMgc2V0IHF1b192YXIKICBxdW9fdmFyIDwtIHN5bShjb21wYXJlX3ZhcikKICAKICAjIHNldCBmYWNldCB2YXIgYW5kIGNvbG9yIHNjYWxlcwogIGlmIChjb21wYXJlX3ZhciA9PSAicG0iKSB7CiAgICBmX3ZhciA8LSBzeW0oImVjbyIpCiAgICBjdmFscyA8LSBjKCJhbmRlc2l0ZSIgPSBhbmRlc2l0ZSwgImJhc2FsdCIgPSBiYXNhbHQsICJncmFuaXRlIiA9IGdyYW5pdGUpIAogIH0gZWxzZSB7CiAgICBmX3ZhciA8LSBzeW0oInBtIikKICAgIGN2YWxzIDwtIGMoIndhcm0iID0gd2FybSwgImNvb2wiID0gY29vbCwgImNvbGQiID0gY29sZCkKICB9CiAgCiAgIyBzcGxpdCBieSBkZXB0aCBhbmQgcGxvdAogIGxhcHBseShzcGxpdChkZiwgZGYkbHlyX2JvdCksIGZ1bmN0aW9uKHgpIHsKICAgIHggJT4lCiAgICAgIGZpbHRlcihmcmMgIT0gIm9QT00iKSAlPiUKICAgICAgbXV0YXRlKEVDTyA9IGZhY3RvcihpZmVsc2UoZWNvID09ICJ3YXJtIiwgIldBUk0iLCBpZmVsc2UoZWNvID09ICJjb29sIiwgIkNPT0wiLCAiQ09MRCIpKSwgbGV2ZWxzID0gYygiV0FSTSIsICJDT09MIiwgIkNPTEQiKSksCiAgICAgICAgZnJjID0gaWZlbHNlKGZyYyA9PSAiZlBPTSIsICJmcmVlIGxpZ2h0IiwgImhlYXZ5IikpICU+JQogICAgZ2dwbG90KC4sIGFlcyh5ZWFyLCBmcmNfMTRjLCBjb2xvciA9ICEhIHF1b192YXIpKSArCiAgICBnZW9tX2xpbmUoZGF0YSA9IGF0bS4xNGMsIGFlcyh5ZWFyLCBkMTRjKSwgCiAgICAgICAgICAgICAgbGluZXR5cGUgPSAzLCBjb2xvciA9ICJncmF5Iiwgc2l6ZSA9IC43KSArCiAgICBnZW9tX2xpbmUoc2l6ZSA9IDEpICsKICAgIGdlb21fcG9pbnQoYWVzKHNoYXBlID0gRUNPKSwgc2l6ZSA9IDMpICsKICAgIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gTlVMTCwgdmFsdWVzID0gY3ZhbHMpICsKICAgIHNjYWxlX3NoYXBlX21hbnVhbChuYW1lID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJXQVJNIiA9IDE1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNPT0wiID0gMTcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ09MRCIgPSAxNiksCiAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiV0FSTSIgPSAid2FybSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ09PTCIgPSAiY29vbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ09MRCIgPSAiY29sZCIpKSArCiAgICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gYygyMDAxLCAyMDA5LCAyMDE5KSkgKwogICAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhmcmMpLCBjb2xzID0gdmFycyghISBmX3ZhcikpICsKICAgIHlsYWIoZXhwcmVzc2lvbignRnJhY3Rpb24gJypEZWx0YSonJ14xNConICjigLApJykpICsKICAgIHRoZW1lX2J3KCkgKwogICAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLAogICAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksCiAgICAgICAgICBzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgc2l6ZSA9IDEyKSwKICAgICAgICAgIHN0cmlwLnRleHQueSA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCBhbmdsZSA9IDAsIHNpemUgPSAxMiksCiAgICAgICAgICBzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAid2hpdGUiLCBjb2xvciA9ICJ3aGl0ZSIpLAogICAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsCiAgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpKSAKICB9KQp9CmBgYAoKIyMjIDE0QyB0aW1lIHNlcmllcwoKYGBge3IgcGxvdC1jd3QtMTRjfQojIHBsb3QKcGxvdC5kMTRjLnRzLmZ4KGRlbnMuMDEuMDkuMTkuc3AuZGYsICJwbSIpCnBsb3QuZDE0Yy50cy5meChkZW5zLjAxLjA5LjE5LnNwLmRmLCAiZWNvIikKYGBgCgpgYGB7ciBlbW1pcC1wbG90LWZ4fQojIGxpbmVhciBtb2RzIGZvciBUUwptb2QuZnggPC0gZnVuY3Rpb24oZnJjLCBseXJfYm90KSB7CiAgZGYgPC0gZGVucy4wMS4wOS4xOS5zcC5kZltkZW5zLjAxLjA5LjE5LnNwLmRmJGZyYyA9PSBmcmMgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZW5zLjAxLjA5LjE5LnNwLmRmJGx5cl9ib3QgPT0gbHlyX2JvdCwgXQogIGRmJHllYXIgPC0gZGYkeWVhciAtIDIwMDAKICBsbShmcmNfMTRjIH4geWVhciAqIHBtICogZWNvLCBkZikKfQptb2QubHMgPC0gbGlzdCgKICB0cy5tb2QuMTAuZlBPTSA9IG1vZC5meCgiZlBPTSIsIDEwKSwKICB0cy5tb2QuMTAubWluQyA9IG1vZC5meCgibWluQyIsIDEwKSwKICB0cy5tb2QuMzAuZlBPTSA9IG1vZC5meCgiZlBPTSIsIDMwKSwKICB0cy5tb2QuMzAubWluQyA9IG1vZC5meCgibWluQyIsIDMwKQopCgogZW1taXAuZnggPC0gZnVuY3Rpb24obW9kLCB2YXIpIHsKICAgYnJrcyA8LSBjKDEsIDksIDE5KQogICBpZiAodmFyID09ICJwbSIpIHsKICAgICBlbW1pcChtb2QsIHBtIH4geWVhciB8IGVjbywgQ0lzID0gVFJVRSwgYXQgPSBsaXN0KHllYXIgPSBicmtzKSkkZGF0YQogICB9IGVsc2UgewogICAgIGVtbWlwKG1vZCwgZWNvIH4geWVhciB8IHBtLCBDSXMgPSBUUlVFLCBhdCA9IGxpc3QoeWVhciA9IGJya3MpKSRkYXRhCiAgIH0KIH0KCiMgcmV0dXJuIGVtbWlwIGxzCnRzLmVtbWlwLmxzIDwtIGxhcHBseShzZXFfYWxvbmcobW9kLmxzKSwgZnVuY3Rpb24oaSkgewogIGVtbWlwLmZ4KG1vZC5sc1tbaV1dLCAicG0iKSAlPiUKICAgIG11dGF0ZShmcmMgPSBpZmVsc2UoaSA9PSAxIHwgMywgImZQT00iLCAibWluQyIpLAogICAgICAgICAgIGx5cl9ib3QgPSBpZmVsc2UoaSA8IDMsIDEwLCAzMCkpCn0pCgojIHBsb3QgZm4KcGxvdC5meCA8LSBmdW5jdGlvbihscywgZGF0YSwgdmFyKSB7CiAgCiAgIyBzZXQgZ3JvdXBpbmcgdmFyCiAgcXVvX3ZhciA8LSBzeW0odmFyKQogIAogICMgc2V0IGNvbG9yIHBhbGV0dGUgJiBmYWNldCB2YXIKICBpZiAodmFyID09ICJwbSIpIHsKICAgIGN2YWxzIDwtIGMoImFuZGVzaXRlIiA9IGFuZGVzaXRlLCAiYmFzYWx0IiA9IGJhc2FsdCwgImdyYW5pdGUiID0gZ3Jhbml0ZSkKICB9IGVsc2UgewogICAgY3ZhbHMgPC0gYygid2FybSIgPSB3YXJtLCAiY29vbCIgPSBjb29sLCAiY29sZCIgPSBjb2xkKQogIH0KICAKICAjIG1vZGlmeSBwb2ludCBhbmQgYXRtIGRhdGEKICBkYXRhIDwtIGRlbnMuMDEuMDkuMTkuc3AuZGYgJT4lCiAgICBmaWx0ZXIoZnJjICE9ICJvUE9NIikgJT4lCiAgICBtdXRhdGUoZWNvRnJjID0gcGFzdGUwKGVjbywgIiAoIiwgZnJjLCAiKSIpLAogICAgICAgICAgIHllYXIgPSB5ZWFyIC0gMjAwMCkKICBhdG0uMTRjJGZyYyA8LSBhdG0uMTRjJFR5cGUKICAKICAjIHJ1biBsb29wCiAgbGFwcGx5KHNlcV9hbG9uZyhscyksIGZ1bmN0aW9uKGkpIHsKICAgIAogICAgIyBnZXQgZGF0YQogICAgZGF0YSA8LSBkYXRhW3doaWNoKGRhdGEkZnJjID09IHVuaXF1ZShsc1tbaV1dW1siZnJjIl1dKSAmCiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhJGx5cl9ib3QgPT0gdW5pcXVlKHVuaXF1ZShsc1tbaV1dW1sibHlyX2JvdCJdXSkpKSwgXQogICAgCiAgICAjIGdldCB0aXRsZQogICAgdGl0bGUgPC0gcGFzdGUobHNbW2ldXVtbImZyYyJdXSwgbHNbW2ldXVtbImx5cl9ib3QiXV0pCiAgICAKICAgICMgcGxvdAogICAgZ2dwbG90KGxzW1tpXV0sIGFlcyh4dmFyLCB5dmFyKSkgKwogICAgICBnZW9tX2xpbmUoYWVzKGNvbG9yID0gISEgcXVvX3ZhciwgbGluZXR5cGUgPSBmcmMpLCBzaXplID0gLjgpICsKICAgICAgZ2VvbV9yaWJib24oYWVzKHltaW4gPSBMQ0wsIHltYXggPSBVQ0wsIGZpbGwgPSAhISBxdW9fdmFyLCBsaW5ldHlwZSA9IGZyYyksIGFscGhhID0gLjEsIHNob3cubGVnZW5kID0gRkFMU0UpICsKICAgICAgZ2VvbV9wb2ludChkYXRhID0gZGF0YSwKICAgICAgICBhZXMoeWVhciwgZnJjXzE0YywgY29sb3IgPSAhISBxdW9fdmFyLCBzaGFwZSA9IGVjb0ZyYyksIHNpemUgPSAxLjUsIGFscGhhID0gLjgpICsKICAgICAgIyBhdG0KICAgICAgZ2VvbV9saW5lKGRhdGEgPSBhdG0uMTRjLCBhZXMoeWVhciwgZDE0YywgbGluZXR5cGUgPSBmcmMpLCBjb2xvciA9ICJibGFjayIpICsKICAgICAgc2NhbGVfbGluZXR5cGVfbWFudWFsKG5hbWUgPSBOVUxMLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoIm1pbkMiLCAiZlBPTSIsICJhdG1vc3BoZXJlIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJtaW5DIiA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmUE9NIiA9IDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhdG1vc3BoZXJlIiA9IDMpKSArCiAgICAgIHNjYWxlX3NoYXBlX21hbnVhbChuYW1lID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoIndhcm0gKG1pbkMpIiwgImNvb2wgKG1pbkMpIiwgImNvbGQgKG1pbkMpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndhcm0gKGZQT00pIiwgImNvb2wgKGZQT00pIiwgImNvbGQgKGZQT00pIiksCiAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJ3YXJtIChtaW5DKSIgPSAxNSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb29sIChtaW5DKSIgPSAxNywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xkIChtaW5DKSIgPSAxNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndhcm0gKGZQT00pIiA9IDAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29vbCAoZlBPTSkiID0gMiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xkIChmUE9NKSIgPSAxKSkgKyAgCiAgICAgIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGN2YWxzKSArCiAgICAgIHNjYWxlX2ZpbGxfbWFudWFsKG5hbWUgPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjdmFscykgKwogICAgICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygwLCAyMCksIAogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gYygxLCA5LCAxOSksIAogICAgICAgICAgICAgICAgICAgICAgICAgZXhwYW5kID0gZXhwYW5zaW9uKGFkZCA9IDIpLAogICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gZnVuY3Rpb24gKHgpIHggKyAyMDAwKSArCiAgICAgICMgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKC0xMTAsIDE3MCkpICsKICAgICAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhlY28pLCBjb2xzID0gdmFycyhwbSkpICsKICAgICAgZ2d0aXRsZSh0aXRsZSkgKwogICAgICB0aGVtZV9idygpICsKICAgICAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcpLAogICAgICAgICAgICBzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgICBzdHJpcC50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgIHBsb3QubWFyZ2luID0gdW5pdChyZXAoMCwgNCksICJjbSIpLAogICAgICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpCiAgfSkKfQoKdHMucGxvdC5scyA8LSBwbG90LmZ4KGxzID0gdHMuZW1taXAubHMsIGRhdGEgPSBkZW5zLjAxLjA5LjE5LnNwLmRmLCB2YXIgPSAicG0iKQoKZW10cmVuZHMobG0oZnJjXzE0YyB+IHllYXIgKiBQTWVjbywgZGVucy4wMS4wOS4xOS5zcC5kZltkZW5zLjAxLjA5LjE5LnNwLmRmJGx5cl9ib3QgPT0gIjEwIiAmIGRlbnMuMDEuMDkuMTkuc3AuZGYkZnJjID09ICJmUE9NIiwgXSksIHBhaXJ3aXNlIH4gUE1lY28sIHZhciA9ICJ5ZWFyIikKYGBgCgpgYGB7ciB0cy1zdGF0c30KZGVucy4wMS4wOS4xOS5zcC5kZiR5ZWFyX2kgPC0gZGVucy4wMS4wOS4xOS5zcC5kZiR5ZWFyIC0gMjAwMAoKIyBmUE9NCmZQT00udHMubW9kLjEwIDwtIGxtKGZyY18xNGMgfiB5ZWFyX2kgKiBwbSAqIGVjbywgCiAgICAgICAgICAgICAgICAgICAgIGRlbnMuMDEuMDkuMTkuc3AuZGZbZGVucy4wMS4wOS4xOS5zcC5kZiRmcmMgPT0gImZQT00iICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbnMuMDEuMDkuMTkuc3AuZGYkbHlyX2JvdCA9PSAxMCwgXSkKZlBPTS50cy5tb2QuMjAgPC0gbG0oZnJjXzE0YyB+IHllYXJfaSAqIHBtICogZWNvLCAKICAgICAgICAgICAgICAgICAgICAgZGVucy4wMS4wOS4xOS5zcC5kZltkZW5zLjAxLjA5LjE5LnNwLmRmJGZyYyA9PSAiZlBPTSIgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVucy4wMS4wOS4xOS5zcC5kZiRseXJfYm90ID09IDIwLCBdKQpmUE9NLnRzLm1vZC4zMCA8LSBsbShmcmNfMTRjIH4geWVhcl9pICogcG0gKiBlY28sIAogICAgICAgICAgICAgICAgICAgICBkZW5zLjAxLjA5LjE5LnNwLmRmW2RlbnMuMDEuMDkuMTkuc3AuZGYkZnJjID09ICJmUE9NIiAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZW5zLjAxLjA5LjE5LnNwLmRmJGx5cl9ib3QgPT0gMzAsIF0pCnN1bW1hcnkoZlBPTS50cy5tb2QuMTApCnN1bW1hcnkoZlBPTS50cy5tb2QuMjApCnN1bW1hcnkoZlBPTS50cy5tb2QuMzApICMgYWxsIG5zCgojIG1pbkMKbWluQy50cy5tb2QuMTAgPC0gbG0oZnJjXzE0YyB+IHllYXJfaSAqIHBtICogZWNvLCAKICAgICAgICAgICAgICAgICAgICAgZGVucy4wMS4wOS4xOS5zcC5kZltkZW5zLjAxLjA5LjE5LnNwLmRmJGZyYyA9PSAibWluQyIgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVucy4wMS4wOS4xOS5zcC5kZiRseXJfYm90ID09IDEwLCBdKQptaW5DLnRzLm1vZC4yMCA8LSBsbShmcmNfMTRjIH4geWVhcl9pICogcG0gKiBlY28sIAogICAgICAgICAgICAgICAgICAgICBkZW5zLjAxLjA5LjE5LnNwLmRmW2RlbnMuMDEuMDkuMTkuc3AuZGYkZnJjID09ICJtaW5DIiAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZW5zLjAxLjA5LjE5LnNwLmRmJGx5cl9ib3QgPT0gMjAsIF0pCm1pbkMudHMubW9kLjMwIDwtIGxtKGZyY18xNGMgfiB5ZWFyX2kgKiBwbSAqIGVjbywgCiAgICAgICAgICAgICAgICAgICAgIGRlbnMuMDEuMDkuMTkuc3AuZGZbZGVucy4wMS4wOS4xOS5zcC5kZiRmcmMgPT0gIm1pbkMiICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbnMuMDEuMDkuMTkuc3AuZGYkbHlyX2JvdCA9PSAzMCwgXSkKc3VtbWFyeShtaW5DLnRzLm1vZC4xMCkKc3VtbWFyeShtaW5DLnRzLm1vZC4yMCkKc3VtbWFyeShtaW5DLnRzLm1vZC4zMCkgIyBtb3N0IGludGVyZXN0aW5nCgpmUE9NLnRzLm1vZC4xMC5lbSA8LSBlbW1lYW5zKGZQT00udHMubW9kLjEwLCBwYWlyd2lzZSB+IHBtIHwgZWNvKQpmUE9NLnRzLm1vZC4xMC5lbWlwIDwtIGVtdHJlbmRzKGZQT00udHMubW9kLjEwLCBwYWlyd2lzZSB+IHBtICogZWNvLCB2YXIgPSAieWVhcl9pIikKCmZQT00udHMubW9kLjIwLmVtIDwtIGVtbWVhbnMoZlBPTS50cy5tb2QuMjAsIHBhaXJ3aXNlIH4gcG0gfCBlY28pCmZQT00udHMubW9kLjIwLmVtaXAgPC0gZW10cmVuZHMoZlBPTS50cy5tb2QuMjAsIHBhaXJ3aXNlIH4gcG0gKiBlY28sIHZhciA9ICJ5ZWFyX2kiKSAKCm1pbkMudHMubW9kLjEwLmVtIDwtIGVtbWVhbnMobWluQy50cy5tb2QuMTAsIHBhaXJ3aXNlIH4gcG0gfCBlY28pCm1pbkMudHMubW9kLjEwLmVtaXAgPC0gZW10cmVuZHMobWluQy50cy5tb2QuMTAsIHBhaXJ3aXNlIH4gcG0gKiBlY28sIHZhciA9ICJ5ZWFyX2kiKQoKbWluQy50cy5tb2QuMjAuZW0gPC0gZW1tZWFucyhtaW5DLnRzLm1vZC4yMCwgcGFpcndpc2UgfiBwbSB8IGVjbykKbWluQy50cy5tb2QuMjAuZW1pcCA8LSBlbXRyZW5kcyhtaW5DLnRzLm1vZC4yMCwgcGFpcndpc2UgfiBwbSAqIGVjbywgdmFyID0gInllYXJfaSIpCgptaW5DLnRzLm1vZC4zMC5lbSA8LSBlbW1lYW5zKG1pbkMudHMubW9kLjMwLCBwYWlyd2lzZSB+IHBtIHwgZWNvKQptaW5DLnRzLm1vZC4zMC5lbWlwIDwtIGVtdHJlbmRzKG1pbkMudHMubW9kLjMwLCBwYWlyd2lzZSB+IHBtICogZWNvLCB2YXIgPSAieWVhcl9pIikKYGBgCgojIyMgQ2hhciBwb29sIGNhbGMKCmBgYHtyIHBvbS1taW5DLTE0Y30KIyBLb2FyYXNoaSBjaGFyIGVxdWF0aW9uCmNoYXIuZnggPC0gZnVuY3Rpb24ocG9tXzE0YykgewogIChwb21fMTRjIC0gMTQ5LjkpIC8gLTcuMjc4IAp9CgojIG1ha2UgZGYgb2YgcG9tICsgbWluQywgY2FsY3VsYXRlIGNoYXIgQyB1c2luZyBLb2FyYXNoaSBkYXRhCiMgcG9tLmMuMTRjLjAxLmRmIDwtIG1lcmdlKAojICAgcG9tLmMuMDEuZGYsCiMgICBkZW5zLjAxLjA5LjE5LnNwLmRmICU+JQojICAgICBmaWx0ZXIoeWVhciA9PSAyMDAxKSwKIyAgIGJ5ID0gYygiUE1lY28iLCAiZnJjIiwgImx5cl9ib3QiKSkgJT4lCiMgICBtdXRhdGUod3RkXzE0YyA9IGNfUE9NX2ZyYyAqIGZyY18xNGMpICU+JQojICAgZ3JvdXBfYnkoUE1lY28sIHBtLCBlY28sIGx5cl9ib3QsIHNvY19QT00sIHllYXIpICU+JQojICAgc3VtbWFyaXplKHBvbV8xNGMgPSBzdW0od3RkXzE0YykpCiMgcG9tLmMuMTRjLjAxLmRmIDwtIHBvbS5jLjE0Yy4wMS5kZiAlPiUKIyAgIG11dGF0ZShjX3BjdF9jaGFyID0gY2hhci5meChwb21fMTRjKSwKIyAgICAgICAgICBzb2NfY2hhciA9IGNfcGN0X2NoYXIgKiBzb2NfUE9NICogMTBeLTIsCiMgICAgICAgICAgc29jX25vbkNoYXIgPSBzb2NfUE9NIC0gc29jX2NoYXIsCiMgICAgICAgICAgZDE0Y19jaGFyID0gLTU3Ny45LAojICAgICAgICAgIGQxNGNfbm9uQ2hhciA9IChwb21fMTRjIC0gZDE0Y19jaGFyICogY19wY3RfY2hhcikgLyAoMTAwIC0gY19wY3RfY2hhcikpCiMgZ2dwbG90KHBvbS5jLjE0Yy4wMS5kZiwgYWVzKGVjbywgZDE0Y19ub25DaGFyLCBmaWxsID0gcG0pKSArCiMgICBnZW9tX2NvbChwb3NpdGlvbiA9ICJkb2RnZSIpICsKIyAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoImFuZGVzaXRlIiA9IGFuZGVzaXRlLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFzYWx0IiA9IGJhc2FsdCwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdyYW5pdGUiID0gZ3Jhbml0ZSkpICsKIyAgIGZhY2V0X2dyaWQocm93cyA9IHZhcnMobHlyX2JvdCkpICsKIyAgIHRoZW1lX2J3KCkgKwojICAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkKCiMgIyBjYWxjLiBjaGFyIGZvciBvUE9NIG9ubHkKIyBvcG9tLmMuMTRjLjAxLmRmIDwtIG1lcmdlKAojICAgYmluZF9yb3dzKHNvYy4yMDAxLmZyY1NPQy5zcC5kZiRPUE9NLCAuaWQgPSAiUE1lY28iKSAlPiUKIyAgICAgbXV0YXRlKGZyYyA9ICJvUE9NIiksCiMgICBkZW5zLjAxLjE5LmRmICU+JQojICAgICBmaWx0ZXIoeWVhciA9PSAyMDAxKSwKIyAgIGJ5ID0gYygiUE1lY28iLCAiZnJjIiwgImx5cl9ib3QiKSkgJT4lCiMgICBtdXRhdGUoY19wY3RfY2hhciA9IGNoYXIuZngoZnJjXzE0YyksCiMgICAgICAgICAgc29jX2NoYXIgPSBjX3BjdF9jaGFyICogbHlyX3NvYyAqIDEwXi0yLAojICAgICAgICAgIHNvY19ub25DaGFyID0gbHlyX3NvYyAtIHNvY19jaGFyLAojICAgICAgICAgIGQxNGNfY2hhciA9IC01NzcuOSwKIyAgICAgICAgICBkMTRjX25vbkNoYXIgPSAoZnJjXzE0YyAtIGQxNGNfY2hhciAqIGNfcGN0X2NoYXIpIC8gKDEwMCAtIGNfcGN0X2NoYXIpKQojIGdncGxvdChvcG9tLmMuMTRjLjAxLmRmLCBhZXMoZWNvLCBjX3BjdF9jaGFyLCBmaWxsID0gcG0pKSArCiMgICBnZW9tX2NvbChwb3NpdGlvbiA9ICJkb2RnZSIpICsKIyAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoImFuZGVzaXRlIiA9IGFuZGVzaXRlLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFzYWx0IiA9IGJhc2FsdCwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdyYW5pdGUiID0gZ3Jhbml0ZSkpICsKIyAgIGZhY2V0X2dyaWQocm93cyA9IHZhcnMobHlyX2JvdCkpICsKIyAgIHRoZW1lX2J3KCkgKwojICAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCgojIyMgRnJhY3Rpb24gdnMgcmVzcGlyZWQgMTRDCgpgYGB7ciBwbG90LUxGLWluY30KIyBsb2FkIGRhdGEKbG9hZCgiL1VzZXJzL2plZmYvc3JhLXRzL3NvdXJjZS9zcmEuYWxsLm1pbi5SRGF0YSIpCmxvYWQoIi9Vc2Vycy9qZWZmL3NyYS10cy9zb3VyY2Uvc3JhLmluYy5hbGwuUkRhdGEiKSAjIG9yaWdpbmFsIGRlcHRocwpsb2FkKCIvVXNlcnMvamVmZi9zcmEtdHMvc291cmNlL3NyYS4xOS4wMS5pbmMuUkRhdGEiKSAjIHNwbGluZWQKbG9hZCgiL1VzZXJzL2plZmYvc3JhLXRzL3NvdXJjZS9zcmEuMjAwMS5pbmMubHMuUkRhdGEiKSAjIHJlcHMgJzAxCmxvYWQoIi9Vc2Vycy9qZWZmL3NyYS10cy9zb3VyY2Uvc3JhLjIwMTkuaW5jLmxzLlJEYXRhIikgIyByZXBzICcxOQoKIyBjb252ZXJ0IGRlbnMuZGYgdG8gd2lkZQpkZW5zLjAxLjE5LmRmLncgPC0gZGVucy4wMS4wOS4xOS5kZiAlPiUKICBzZWxlY3QoUE1lY28sIFllYXIsIGZyYywgbHlyX2JvdCwgZnJjXzE0YykgJT4lCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGZyYywgdmFsdWVzX2Zyb20gPSBmcmNfMTRjKQpkZW5zLmluYy5taW4udyA8LSBtZXJnZSgKICBzcmEuaW5jLmFsbCAlPiUKICAgIGZpbHRlcihkMTRjX21lYW4gPiAtNzApLAogIGRlbnMuMDEuMTkuZGYudyAlPiUKICAgIG11dGF0ZShwbSA9IGlmZWxzZShncmVwbCgiQU4iLCBQTWVjbyksICJhbmRlc2l0ZSIsIAogICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiQlMiLCBQTWVjbyksICJiYXNhbHQiLCAiZ3Jhbml0ZSIpKSwKICAgICAgICAgICBlY28gPSBpZmVsc2UoZ3JlcGwoInBwIiwgUE1lY28pLCAid2FybSIsIAogICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIndmIiwgUE1lY28pLCAiY29vbCIsICJjb2xkIikpKSkKCiMgZGVwdGggaW5kZXggZngKZGVwdGguaXguZnggPC0gZnVuY3Rpb24oZGYsIHNwbGl0X3Zhcl9hID0gIlllYXIiLCBzcGxpdF92YXJfYiA9ICJQTWVjbyIpIHsKICBiaW5kX3Jvd3MoCiAgICBsYXBwbHkoc3BsaXQoZGYsIGRmW1tzcGxpdF92YXJfYV1dKSwgZnVuY3Rpb24oeCkgCiAgICAgIGJpbmRfcm93cyhsYXBwbHkoc3BsaXQoeCwgeFtbc3BsaXRfdmFyX2JdXSksIGZ1bmN0aW9uKHkpIHsKICAgICAgICBpZiAoaXMubnVsbCh5JGRlcHRoKSkgewogICAgICAgICAgeVtvcmRlcih5JGx5cl9ib3QpLCBdICU+JQogICAgICAgICAgICBtdXRhdGUoZGVwdGggPSBzZXEoMSwgbnJvdyh5KSkpIAogICAgICAgIH0KICAgICAgfSkpCiAgICAgICkKICAgICkKfQoKIyBtYWtlIHJlcHMgZGYKZGVucy5pbmMucmVwcy53IDwtIG1lcmdlKAogIGJpbmRfcm93cygKICAgIG1hcHBseShyYmluZCwgCiAgICAgICAgICAgc3JhLjIwMTkuaW5jLmxzLAogICAgICAgICAgIHNyYS4yMDAxLmluYy5scywKICAgICAgICAgICBTSU1QTElGWSA9IEZBTFNFKSksCiAgZGVucy4wMS4xOS5kZi53ICU+JQogICAgZmlsdGVyKFllYXIgIT0gMjAwOSkpICU+JQogIG11dGF0ZShwbSA9IGlmZWxzZShncmVwbCgiQU4iLCBQTWVjbyksICJhbmRlc2l0ZSIsIAogICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiQlMiLCBQTWVjbyksICJiYXNhbHQiLCAiZ3Jhbml0ZSIpKSwKICAgICAgICAgZWNvID0gaWZlbHNlKGdyZXBsKCJwcCIsIFBNZWNvKSwgIndhcm0iLCAKICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCJ3ZiIsIFBNZWNvKSwgImNvb2wiLCAiY29sZCIpKSwKICAgICAgICAgeWVhciA9IGZhY3RvcihZZWFyKSkgJT4lCiAgZmlsdGVyKGQxNGMgPiAtNzApCmRlbnMuaW5jLnJlcHMudyA8LSBiaW5kX3Jvd3MoCiAgbGFwcGx5KHNwbGl0KGRlbnMuaW5jLnJlcHMudywgZGVucy5pbmMucmVwcy53JFllYXIpLCBmdW5jdGlvbih4KSBkZXB0aC5peC5meCh4LCBzcGxpdF92YXJfYSA9ICJyZXAiKSkpCgojIGFkZCBkZXB0aCBpbmRleCBjb2wKZGVucy5pbmMubWluLncgPC0gZGVwdGguaXguZngoZGVucy5pbmMubWluLncpCgojIHBsb3QgaW5jIHYgTEYKIyBwbG90IHByb2ZpbGVzIGJ5IHllYXIgYW5kIGZyYWN0aW9uIHR5cGUKaW5jLnBsb3QuZnggPC0gZnVuY3Rpb24oZGVucy5pbmMuZGYsIGZyYykgewogIAogIHF1b192YXIgPC0gc3ltKGZyYykKICB5bGFiIDwtIGlmZWxzZShmcmMgPT0gImZQT00iLCBleHByZXNzaW9uKCdmcmVlIGxpZ2h0IEMgJypEZWx0YSonJ14xNConQyAo4oCwKScpLCAKICAgICAgICAgICAgICAgICBpZmVsc2UoZnJjID09ICJvUE9NIiwgCiAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb24oJ29jY2x1ZGVkIGxpZ2h0IEMgJypEZWx0YSonJ14xNConQyAo4oCwKScpLAogICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uKCdtaW4tYXNzb2MuIEMgJypEZWx0YSonJ14xNConQyAo4oCwKScpKSkKICBkZW5zLmluYy5kZiAlPiUKICAgIGZpbHRlcihkMTRjX21lYW4gPiAtNzApICU+JQogICAgZ2dwbG90KC4sIGFlcyhkMTRjX21lYW4sICEhIHF1b192YXIsIGNvbG9yID0gcG0sIHNoYXBlID0gZWNvKSkgKwogICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgY29sb3IgPSAibGlnaHRncmF5IikgKwogICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgY29sb3IgPSAibGlnaHRncmF5IikgKwogICAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgICBnZW9tX3BvaW50KHNpemUgPSAzKSArCiAgICBnZW9tX2Vycm9yYmFyaChhZXMoeG1heCA9IGQxNGNfdSwgeG1pbiA9IGQxNGNfbCksIGhlaWdodCA9IDEpICsKICAgIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gIlBhcmVudCBtYXRlcmlhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiYW5kZXNpdGUiID0gYW5kZXNpdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFzYWx0IiA9IGJhc2FsdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJncmFuaXRlIiA9IGdyYW5pdGUpKSArCiAgICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICJDbGltYXRlIiwKICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJ3YXJtIiA9IDE1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvb2wiID0gMTcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sZCIgPSAxNikpICsKICAgICMgY29vcmRfY2FydGVzaWFuKHhsaW0gPSBjKC0xMjAsIDExMCksIHlsaW0gPSBjKC0xMjAsIDExMCkpICsKICAgIGZhY2V0X2dyaWQoY29scyA9IHZhcnMoZGVwdGgpLCByb3dzID0gdmFycyhZZWFyKSkgKyAKICAgIHhsYWIoZXhwcmVzc2lvbihEZWx0YSonJ14xNConQy1DTydbMl0qJyAo4oCwKScpKSArCiAgICB5bGFiKHlsYWIpICsKICAgIHRoZW1lX2J3KCkgKwogICAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgIGFzcGVjdC5yYXRpbyA9IDEpCn0KCiMgcGxvdCByZXNwaXJlZCBhZ2FpbnN0IG5vbkNoYXI7IHNwbGluZWQgZGF0YTsgJzAxIG9ubHkKZGVucy5pbmMubm9uQ2hhci5kZiA8LSBtZXJnZSgKICBwb20uYy4xNGMuMDEuZGZbICwgYygiUE1lY28iLCAicG0iLCAiZWNvIiwgImx5cl9ib3QiLCAieWVhciIsICJkMTRjX25vbkNoYXIiKV0sCiAgc3JhLjE5LjAxLmluY1sgLCB3aGljaCghKG5hbWVzKHNyYS4xOS4wMS5pbmMpICVpbiUgYygiUE0iLCAiRUNPIikpKV0pCiAgCmRlbnMuaW5jLm5vbkNoYXIuZGYgJT4lCiAgZmlsdGVyKGQxNGMgPiAtNzApICU+JQogIGdncGxvdCguLCBhZXMoZDE0YywgZDE0Y19ub25DaGFyLCBjb2xvciA9IHBtKSkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGNvbG9yID0gImxpZ2h0Z3JheSIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBjb2xvciA9ICJsaWdodGdyYXkiKSArCiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgZ2VvbV9wb2ludChhZXMoc2hhcGUgPSBlY28pLCBzaXplID0gMykgKwogIGdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gZDE0Y19taW4sIHhtYXggPSBkMTRjX21heCkpICsKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICJQYXJlbnQgbWF0ZXJpYWwiLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJhbmRlc2l0ZSIgPSBhbmRlc2l0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFzYWx0IiA9IGJhc2FsdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3Jhbml0ZSIgPSBncmFuaXRlKSkgKwogIHNjYWxlX3NoYXBlX21hbnVhbChuYW1lID0gIkNsaW1hdGUiLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJ3YXJtIiA9IDE1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb29sIiA9IDE3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xkIiA9IDE2KSkgKwogIGZhY2V0X2dyaWQoY29scyA9IHZhcnMobHlyX2JvdCkpICsKICB4bGFiKGV4cHJlc3Npb24oRGVsdGEqJydeMTQqJ0MtQ08nWzJdKicgKOKAsCknKSkgKwogIHlsYWIoZXhwcmVzc2lvbignbm9uLWNoYXIgJypEZWx0YSonJ14xNConQyAo4oCwKScpKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBhc3BlY3QucmF0aW8gPSAxKQpgYGAKCmBgYHtyIHBsb3QtaW5jLWRlbnN9CmluYy5wbG90LmZ4KGRlbnMuaW5jLm1pbi53LCAiZlBPTSIpIAppbmMucGxvdC5meChkZW5zLmluYy5taW4udywgIm9QT00iKQppbmMucGxvdC5meChkZW5zLmluYy5taW4udywgIm1pbkMiKQpgYGAKCmBgYHtyIHN0YXRzLWZyYy1yZXNwfQpmUE9NLnJlc3AubW9kIDwtIGxtKGZQT00gfiBkMTRjICogcG0gKiBlY28sIGRlbnMuaW5jLnJlcHMudykKbWluQy5yZXNwLm1vZCA8LSBsbShtaW5DIH4gZDE0YyAqIHBtICogZWNvICsgeWVhciwgZGVucy5pbmMucmVwcy53KQptaW5DLnJlc3AubW9kLjAxIDwtIGxtKG1pbkMgfiBkMTRjICogcG0gKiBlY28sIAogICAgICAgICAgICAgICAgICAgICAgIGRlbnMuaW5jLnJlcHMud1tkZW5zLmluYy5yZXBzLnckWWVhciA9PSAiMjAwMSIsIF0pCm1pbkMucmVzcC5tb2QuMTkgPC0gbG0obWluQyB+IGQxNGMgKiBwbSAqIGVjbywgCiAgICAgICAgICAgICAgICAgICAgICAgZGVucy5pbmMucmVwcy53W2RlbnMuaW5jLnJlcHMudyRZZWFyID09ICIyMDE5IiwgXSkKCnN1bW1hcnkoZlBPTS5yZXNwLm1vZCkKc3VtbWFyeShtaW5DLnJlc3AubW9kKQoKZlBPTS5yZXNwLmVtLlBNZWNvIDwtIGVtbWVhbnMoZlBPTS5yZXNwLm1vZCwgcGFpcndpc2UgfiBwbSB8IGVjbykKZlBPTS5yZXNwLmVtLkVDT3BtIDwtIGVtbWVhbnMoZlBPTS5yZXNwLm1vZCwgcGFpcndpc2UgfiBlY28gfCBwbSkKZlBPTS5yZXNwLmVtaXAuZWNvIDwtIGVtdHJlbmRzKGZQT00ucmVzcC5tb2QsIHBhaXJ3aXNlIH4gZWNvLCB2YXIgPSAiZDE0YyIpICMgbnMKZlBPTS5yZXNwLmVtaXAucG0gPC0gZW10cmVuZHMoZlBPTS5yZXNwLm1vZCwgcGFpcndpc2UgfiBwbSwgdmFyID0gImQxNGMiKSAjIG5zCgptaW5DLnJlc3AuZW0uUE1lY28gPC0gZW1tZWFucyhtaW5DLnJlc3AubW9kLCBwYWlyd2lzZSB+IHBtIHwgZWNvKQptaW5DLnJlc3AuZW0uRUNPcG0gPC0gZW1tZWFucyhtaW5DLnJlc3AubW9kLCBwYWlyd2lzZSB+IGVjbyB8IHBtKQptaW5DLnJlc3AuZW1pcC5lY28gPC0gZW10cmVuZHMobWluQy5yZXNwLm1vZCwgcGFpcndpc2UgfiBlY28sIHZhciA9ICJkMTRjIikgCiMgY29sZCAtIHdhcm0gcCA9IDAuMDE3NiwgZXN0IGRpZiA9IC0uNDQKbWluQy5yZXNwLmVtaXAucG0gPC0gZW10cmVuZHMobWluQy5yZXNwLm1vZCwgcGFpcndpc2UgfiBwbSwgdmFyID0gImQxNGMiKSAjIG5zCmBgYAoKYGBge3IgZnJjLXJlc3AtcGxvdHMtZWd1fQojIHBsb3QgZngKZGVucy5pbmMucGxvdC5meCA8LSBmdW5jdGlvbihkZiwgdmFyLCBkMTRjX3ZhciwgZl92YXJfYyA9IE5BLCBmX3Zhcl9yID0gTkEsIGZyY19maWx0ZXIgPSBOQSwgc21vb3RoID0gRkFMU0UsIGJ5X2dyb3VwID0gVFJVRSkgewogIAogICMgcXVvdGUgdmFycwogIHF1b192YXIgPC0gc3ltKHZhcikKICBxdW9fZDE0Y192YXIgPC0gc3ltKGQxNGNfdmFyKQogIAogICMgbXV0YXRlIGRmCiAgZGYgPC0gZGYgJT4lCiAgICBzZWxlY3QoIW9QT00pICU+JQogICAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKGZQT00sIG1pbkMpLCBuYW1lc190byA9ICJmcmMiLCB2YWx1ZXNfdG8gPSAiZnJjXzE0YyIpICU+JQogICAgbXV0YXRlKGZyYyA9IGlmZWxzZShmcmMgPT0gImZQT00iLCAiZnJlZSBsaWdodCIsICJoZWF2eSIpLAogICAgICAgICAgIGVjb0ZyYyA9IHBhc3RlMChlY28sICIgKCIsIGZyYywgIikiKSkKICAKICAjIHNldCBjb2xvcnMKICBpZiAodmFyID09ICJwbSIpIHsKICAgIGNvbF9uYW1lIDwtICJQYXJlbnQgbWF0ZXJpYWwiCiAgICBjdmFscyA8LSBjKCJhbmRlc2l0ZSIgPSBhbmRlc2l0ZSwgImJhc2FsdCIgPSBiYXNhbHQsICJncmFuaXRlIiA9IGdyYW5pdGUpIAogIH0gZWxzZSB7CiAgICBjb2xfbmFtZSA8LSAiQ2xpbWF0ZSIKICAgIGN2YWxzIDwtIGMoIndhcm0iID0gd2FybSwgImNvb2wiID0gY29vbCwgImNvbGQiID0gY29sZCkKICB9CiAgCiAgIyBmcmMgZmlsdGVyCiAgaWYgKCFpcy5uYShmcmNfZmlsdGVyKSkgewogICAgZGYgPC0gZGYgJT4lCiAgICAgIGZpbHRlcihmcmMgPT0gZnJjX2ZpbHRlcikKICAgIGlmIChmcmNfZmlsdGVyID09ICJmcmVlIGxpZ2h0IikgewogICAgICBzaHBfdmFscyA8LSBjKCJ3YXJtIChmcmVlIGxpZ2h0KSIgPSAwLAogICAgICAgICAgICAgICAgICAgImNvb2wgKGZyZWUgbGlnaHQpIiA9IDIsCiAgICAgICAgICAgICAgICAgICAiY29sZCAoZnJlZSBsaWdodCkiID0gMSkKICAgIH0gZWxzZSB7CiAgICAgIHNocF92YWxzIDwtIGMoIndhcm0gKGhlYXZ5KSIgPSAxNSwKICAgICAgICAgICAgICAgICAgICJjb29sIChoZWF2eSkiID0gMTcsCiAgICAgICAgICAgICAgICAgICAiY29sZCAoaGVhdnkpIiA9IDE2KQogICAgfQogIH0KICAKICBpZiAoYnlfZ3JvdXApIHsKICAgIHAgPC0gZ2dwbG90KGRmLCBhZXMoISEgcXVvX2QxNGNfdmFyLCBmcmNfMTRjLCBjb2xvciA9ICEhIHF1b192YXIpKSAKICB9IGVsc2UgewogICAgcCA8LSBnZ3Bsb3QoZGYsIGFlcyghISBxdW9fZDE0Y192YXIsIGZyY18xNGMpKSAKICB9CiAgcCA8LSBwICsKICAgIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogICAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSBjb2xfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjdmFscykgKwogICAgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWUgPSAiQ2xpbWF0ZSAoZnJhY3Rpb24pIiwKICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBzaHBfdmFscykgKwogICAgc2NhbGVfc2l6ZShuYW1lID0gIkRlcHRoIiwKICAgICAgICAgICAgICAgYnJlYWtzID0gYygyLCAzLCA0KSwKICAgICAgICAgICAgICAgcmFuZ2UgPSBjKDIsIDQpLAogICAgICAgICAgICAgICBsYWJlbHMgPSBjKCIxIiwgIjIiLCAiMyIpKSArCiAgICAjIGNvb3JkX2NhcnRlc2lhbih4bGltID0gYygtMTQwLCAxOTApLCB5bGltID0gYygtMTQwLCAxOTApKSArCiAgICB5bGFiKGV4cHJlc3Npb24oJ0ZyYWN0aW9uICcqRGVsdGEqJydeMTQqJyAo4oCwKScpKSArCiAgICB4bGFiKGV4cHJlc3Npb24oJ1Jlc3BpcmVkICcqRGVsdGEqJydeMTQqJ0MtQ08nWzJdKicgKOKAsCknKSkgKwogICAgZ3VpZGVzKHNpemUgPSAibm9uZSIsCiAgICAgICAgICAgc2hhcGUgPSBndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzID0gbGlzdChzaXplID0gMykpKSArCiAgICB0aGVtZV9idygpICsKICAgIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICBhc3BlY3QucmF0aW8gPSAxLAogICAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLAogICAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksCiAgICAgICAgICBzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgc2l6ZSA9IDEyKSwKICAgICAgICAgIHN0cmlwLnRleHQueSA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCBhbmdsZSA9IDAsIHNpemUgPSAxMiksCiAgICAgICAgICBzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAid2hpdGUiLCBjb2xvciA9ICJ3aGl0ZSIpLAogICAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSkKICAKICBpZiAoIWlzLm5hKGZyY19maWx0ZXIpKSB7CiAgICBwICsgZ2d0aXRsZShmcmNfZmlsdGVyKQogIH0KICAKICBpZiAoIWlzLm5hKGZfdmFyX2MpKSB7CiAgICBxdW9fZl92YXJfYyA8LSBzeW0oZl92YXJfYykKICAgIGlmIChpcy5uYShmX3Zhcl9yKSkgewogICAgICBwIDwtIHAgKyBmYWNldF9ncmlkKGNvbHMgPSB2YXJzKCEhIHF1b19mX3Zhcl9jKSkKICAgIH0gZWxzZSB7CiAgICAgIHF1b19mX3Zhcl9yIDwtIHN5bShmX3Zhcl9yKQogICAgICBwIDwtIHAgKyBmYWNldF9ncmlkKGNvbHMgPSB2YXJzKCEhIHF1b19mX3Zhcl9jKSwgcm93cyA9IHZhcnMoISEgcXVvX2ZfdmFyX3IpKSAKICAgIH0KICB9CiAgCiAgaWYgKHNtb290aCkgewogICAgaWYgKGJ5X2dyb3VwKSB7CiAgICAgIHAgPC0gcCArIAogICAgICAgIGdlb21fc21vb3RoKG1ldGhvZCA9IGxtLCBmb3JtdWxhID0geSB+IHgsIHNlID0gRkFMU0UsIHNpemUgPSAxLjIpCiAgICB9IGVsc2UgewogICAgICBwIDwtIHAgKyAKICAgICAgICBnZW9tX3Ntb290aChtZXRob2QgPSBsbSwgZm9ybXVsYSA9IHkgfiB4LCBzZSA9IEZBTFNFLCBzaXplID0gMS4yLCAKICAgICAgICAgICAgICAgICAgICBjb2xvciA9ICJibGFjayIpCiAgICB9CiAgICBwIDwtIHAgKwogICAgICBnZW9tX3BvaW50KGFlcyhzaGFwZSA9IGVjb0ZyYywgc2l6ZSA9IGRlcHRoLCBjb2xvciA9ICEhIHF1b192YXIpLCBhbHBoYSA9IC4zKQogICAgICBpZiAoZDE0Y192YXIgPT0gImQxNGNfbWVhbiIpIHsKICAgICAgICBwIDwtIHAgKyAKICAgICAgICAgIGdlb21fZXJyb3JiYXJoKGFlcyh4bWF4ID0gZDE0Y191LCB4bWluID0gZDE0Y19sLCBjb2xvciA9ICEhIHF1b192YXIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCA9IDEsIGFscGhhID0gLjMpCiAgICAgIH0KICAgIHAgKwogICAgICBndWlkZXMoc2hhcGUgPSBndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzID0gbGlzdChzaXplID0gMywgYWxwaGEgPSAxKSkpCiAgfSBlbHNlIHsKICAgIHAgPC0gcCArCiAgICAgIGdlb21fcG9pbnQoYWVzKHNoYXBlID0gZWNvRnJjLCBzaXplID0gZGVwdGgsIGNvbG9yID0gISEgcXVvX3ZhcikpCiAgICBpZiAoZDE0Y192YXIgPT0gImQxNGNfbWVhbiIpIHsKICAgICAgcCA8LSBwICsKICAgICAgICBnZW9tX2Vycm9yYmFyaChhZXMoeG1heCA9IGQxNGNfdSwgeG1pbiA9IGQxNGNfbCwgY29sb3IgPSAhISBxdW9fdmFyKSwgCiAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0ID0gMSwgYWxwaGEgPSAuMykKICAgIH0KICAgIHAKICB9Cn0KYGBgCgpgYGB7ciBwbG90LWZyYy1pbmMtZWd1fQpkZW5zLmluYy5wbG90LmZ4KGRmID0gZGVucy5pbmMubWluLncsIHZhciA9ICJwbSIsIGQxNGNfdmFyID0gImQxNGNfbWVhbiIsIGZyY19maWx0ZXIgPSAiZnJlZSBsaWdodCIpCiMgZGVucy5pbmMucGxvdC5meChkZiA9IGRlbnMuaW5jLm1pbi53LCB2YXIgPSAicG0iLCBkMTRjX3ZhciA9ICJkMTRjX21lYW4iLCBmcmNfZmlsdGVyID0gImZyZWUgbGlnaHQiLCBzbW9vdGggPSBULCBieV9ncm91cCA9IEYpCmRlbnMuaW5jLnBsb3QuZngoZGYgPSBkZW5zLmluYy5taW4udywgdmFyID0gInBtIiwgZDE0Y192YXIgPSAiZDE0Y19tZWFuIiwgZnJjX2ZpbHRlciA9ICJmcmVlIGxpZ2h0Iiwgc21vb3RoID0gVCwgYnlfZ3JvdXAgPSBUKQpkZW5zLmluYy5wbG90LmZ4KGRmID0gZGVucy5pbmMubWluLncsIHZhciA9ICJwbSIsIGQxNGNfdmFyID0gImQxNGNfbWVhbiIsIGZyY19maWx0ZXIgPSAiaGVhdnkiKQpkZW5zLmluYy5wbG90LmZ4KGRmID0gZGVucy5pbmMubWluLncsIHZhciA9ICJwbSIsIGQxNGNfdmFyID0gImQxNGNfbWVhbiIsIGZyY19maWx0ZXIgPSAiaGVhdnkiLCBzbW9vdGggPSBUKQpkZW5zLmluYy5wbG90LmZ4KGRmID0gZGVucy5pbmMubWluLncsIHZhciA9ICJlY28iLCBkMTRjX3ZhciA9ICJkMTRjX21lYW4iLCBmcmNfZmlsdGVyID0gImhlYXZ5Iiwgc21vb3RoID0gVCkKZGVucy5pbmMucGxvdC5meChkZiA9IGRlbnMuaW5jLm1pbi53LCB2YXIgPSAiZWNvIiwgZDE0Y192YXIgPSAiZDE0Y19tZWFuIiwgZnJjX2ZpbHRlciA9ICJmcmVlIGxpZ2h0Iiwgc21vb3RoID0gVCkKYGBgCgojIyBUaGVybWFsIGZyYWN0aW9ucwojIyMgQyByZWxlYXNlICh0aGVybW9ncmFtcykKYGBge3IgdGhlcm1hbC1kYXRhfQojIGxvYWQgdGhlcm1vZ3JhbSBkYXRhIGFuZCBjb21iaW5lCkFOd2YuMzAuSEZfdG1sIDwtIHJlYWQuY3N2KCIuLi9kYXRhL2V4dGVybmFsL3NyYV90aG1sXzE0Q19zdG9uZXIvc21vb3RoX0FOd2YgTU9NX1JQTy5jc3YiKQpCU3dmLjMwLkhGX3RtbCA8LSByZWFkLmNzdigiLi4vZGF0YS9leHRlcm5hbC9zcmFfdGhtbF8xNENfc3RvbmVyL3Ntb290aF9CU3dmIDIwLTMwIEZyYWMgZml4LmNzdiIpCkdSd2YuMzAuSEZfdG1sIDwtIHJlYWQuY3N2KCIuLi9kYXRhL2V4dGVybmFsL3NyYV90aG1sXzE0Q19zdG9uZXIvc21vb3RoX0dSd2YgTU9NX1JQTy5jc3YiKQpIRl90bWwuZGYgPC0gY2JpbmQocmJpbmQoQU53Zi4zMC5IRl90bWwsIEJTd2YuMzAuSEZfdG1sLCBHUndmLjMwLkhGX3RtbCksIAogICAgICAgICAgICAgICAgICAgc2l0ZSA9IGMocmVwKCJBTndmIiwgbnJvdyhBTndmLjMwLkhGX3RtbCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcCgiQlN3ZiIsIG5yb3coQlN3Zi4zMC5IRl90bWwpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXAoIkdSd2YiLCBucm93KEdSd2YuMzAuSEZfdG1sKSkpKQpIRl90bWwuZGYkUE0gPC0gc3Vic3RyKEhGX3RtbC5kZiRzaXRlLCAxLCAyKQoKIyB0ZW1wIGN1dHMgZGYKSEZfdG1sLnRlbXBzLmRmIDwtIGRhdGEuZnJhbWUoCiAgUE0gPSByZXAoYygiQU4iLCAiQlMiLCAiR1IiKSwgZWEgPSA1KSwKICBjdXQgPSByZXAoMTo1LCAzKSwKICB0ZW1wID0gYygxNDAsIDI0NSwgMzQwLCAzOTAsIDQ5NSwKICAgICAgICAgICAxNDEuNSwgMjQ2LjUsIDI5MCwgMzY0LCA0ODQsCiAgICAgICAgICAgMTQzLCAyNDgsIDI5MywgMzY3LCA0ODcpCikKCiMgcGxvdApnZ3Bsb3QoSEZfdG1sLmRmLCBhZXModGVtcCwgTW92aW5nLCBjb2xvciA9IFBNKSkgKwogICMgZ2VvbV92bGluZShhZXMoeGludGVyY2VwdCA9IHRlbXAsIGNvbG9yID0gUE0pLAogICMgICAgICAgICAgICBkYXRhID0gSEZfdG1sLnRlbXBzLmRmLAogICMgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCBhbHBoYSA9IC41LCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiAgZ2VvbV9saW5lKCkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJBTiIgPSBhbmRlc2l0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQlMiID0gYmFzYWx0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHUiIgPSBncmFuaXRlKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCkpCmBgYAoKIyMjIFRoZXJtYWwgZnJhY3Rpb24gMTRDCgpgYGB7ciB0bWwtMTRjfQojIHdyYW5nbGUgMTRDIGRhdGEgdG8gZGYKZnJjLjE0Yy5kZiA8LSBiaW5kX3Jvd3MoYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtZnJjMTktTU9NLXRobWxfMjAyMi0wMS0yMGApICU+JSAKICBkcGx5cjo6c2xpY2UoMToxNSkgJT4lCiAgbXV0YXRlKFBNID0gc3Vic3RyKFByb2JlLCAxLCAyKSwKICAgICAgICAgRUNPID0gIndmIiwgCiAgICAgICAgIHRobWxfZnJjID0gYXMubnVtZXJpYyhzdWJzdHIoUHJvYmUsIG5jaGFyKFByb2JlKSwgbmNoYXIoUHJvYmUpKSkpICU+JQogICMgZml4IFNoYW5lJ3MgbWlzbGFiZWxpbmcgb2YgMTRDIGRhdGEKICBtdXRhdGUoUE0gPSBpZmVsc2UoUE0gPT0gIkFOIiwgIkdSIiwgaWZlbHNlKFBNID09ICJHUiIsICJBTiIsIFBNKSkpICU+JQogIHJlbmFtZShmbSA9IEYxNEMsIGZtX2VyciA9IGVyciwgZDE0YyA9IGDiiIYxNEMuKOKAsClgLCBkMTRjX2VyciA9IGBlcnIuKOKAsClgKSAlPiUKICBzZWxlY3QoUE0sIEVDTywgdGhtbF9mcmMsIGQxNGMsIGQxNGNfZXJyLCBmbSwgZm1fZXJyKQoKIyBzYXZlCnNhdmUoZnJjLjE0Yy5kZiwgZmlsZSA9ICJmcmMuMTRjLmRmIikKCiMgcGxvdApnZ3Bsb3QoZnJjLjE0Yy5kZiwgYWVzKHRobWxfZnJjLCBkMTRjLCBmaWxsID0gUE0pKSArCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiQU4iID0gYW5kZXNpdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQlMiID0gYmFzYWx0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdSIiA9IGdyYW5pdGUpKSArIAogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoUE0pKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkKCiMgc3RlcCBwbG90CmZyYy4xNGMuZGYgJT4lCiAgZmlsdGVyKHRobWxfZnJjID09IDUpICU+JQogIG11dGF0ZSh0aG1sX2ZyYyA9IDYpICU+JQogIHJiaW5kKGZyYy4xNGMuZGYsIC4pICU+JQogIGdncGxvdCguLCBhZXModGhtbF9mcmMsIGQxNGMsIGNvbG9yID0gUE0pKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAiZG90dGVkIikgKwogIGdlb21fc3RlcCgpICsKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoIkFOIiA9IGFuZGVzaXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCUyIgPSBiYXNhbHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdSIiA9IGdyYW5pdGUpLAogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJBTiIgPSAiYW5kZXNpdGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCUyIgPSAiYmFzYWx0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR1IiID0gImdyYW5pdGUiKSkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMS41LCA1LjUpLCBsYWJlbHMgPSBhcy5jaGFyYWN0ZXIoc2VxKDEsIDUpKSkgKwogIHlsYWIoZXhwcmVzc2lvbihEZWx0YSonJ14xNConQyAo4oCwKScpKSArCiAgeGxhYigiVGhlcm1hbCBmcmFjdGlvbiIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpKQpgYGAKCmBgYHtyIHRtbC1mcmMtY30KY3N2LmRpciA8LSAiLi4vZGF0YS9leHRlcm5hbC9zcmFfdGhtbF8xNENfc3RvbmVyIgpubXMgPC0gbGlzdC5maWxlcyhwYXRoID0gY3N2LmRpciwgcGF0dGVybiA9ICIqLmNzdiIpCm5tc19zbW9vdGggPC0gbm1zW3doaWNoKGdyZXBsKCJzbW9vdGgiLCBubXMpKV0KY3N2bGlzdCA8LSBsYXBwbHkoc2VxX2Fsb25nKG5tc19zbW9vdGgpLCBmdW5jdGlvbihpKSB7CiAgcmVhZC5jc3YocGFzdGUoY3N2LmRpciwgbm1zX3Ntb290aFtpXSwgc2VwID0gIi8iKSkKfSkKbmFtZXMoY3N2bGlzdCkgPC0gc2FwcGx5KG5tc19zbW9vdGgsIHN1YnN0ciwgc3RhcnQgPSA4LCBzdG9wID0gMTEsIFVTRS5OQU1FUyA9IEZBTFNFKQojIGZyYy5meCA8LSBmdW5jdGlvbihkYXQsIHRlbXBzX2luKSB7CiMgICBkYXQgPC0gZGF0ICU+JQojICAgICBmaWx0ZXIoIWlzLm5hKENPMl9zY2FsZWQpIHwgIWlzLm5hKHRlbXApKSAlPiUKIyAgICAgc2VsZWN0KHRlbXAsIENPMl9zY2FsZWQpICU+JQojICAgICByZW5hbWUoVGVtcF9hdiA9IHRlbXAsCiMgICAgICAgICAgICBDTzJfYXYgPSBDTzJfc2NhbGVkKQojICAgCiMgICAjIGZpdCBzcGxpbmUKIyAgICMgc2V0IGtub3RzCiMgICBtYXh0ZW1wIDwtIG1heChkYXQkVGVtcF9hdikKIyAgIHRlbXBzIDwtIGModGVtcHNfaW4sIG1heHRlbXApICNUbyBlc3RhYmxpc2ggdXBwZXIgbGltaXQKIyAgIAojICAgIyBkZWZpbmUgc3BsaW5lCiMgICBzcF9mdW4gPC0gc3BsaW5lZnVuKGRhdCRUZW1wX2F2LCBkYXQkQ08yX2F2LCBtZXRob2QgPSAnZm1tJykKIyAgIHRvbCA8LSAxLjVlLTQgKiAyCiMgICBhcmVhbGlzdCA8LSBsaXN0KCkKIyAgIGwgPC0gMQojICAgdSA8LSAxCiMgICAKIyAgICMgcnVuIHNwbGluZQojICAgZm9yIChpIGluIHRlbXBzKSB7CiMgICAgIGlmICh1ID09IDEpewojICAgICAgIGxvd2VyIDwtIDEwMAojICAgICAgIHVwcGVyIDwtIHRlbXBzW3VdCiMgICAgICAgdSA8LSB1KzEKIyAgICAgfSBlbHNlIHsKIyAgICAgICBsb3dlciA8LSB0ZW1wc1tsXQojICAgICAgIHVwcGVyIDwtIHRlbXBzW3VdCiMgICAgICAgdSA8LSB1ICsgMQojICAgICAgIGwgPC0gbCArIDEKIyAgICAgfQojICAgICAKIyAgICAgIyBjYWxjIGFyZWEKIyAgICAgYXJlYSA8LSBpbnRlZ3JhdGUoc3BfZnVuLCBsb3dlciwgdXBwZXIsIHN1YmRpdmlzaW9ucyA9IDgwMDAsIHJlbC50b2wgPSB0b2wpCiMgICAgIGFyZWFsaXN0IDwtIGMoYXJlYWxpc3QsIGFyZWFbMV0pCiMgICB9CiMgICAKIyAgICMjIyBDTzIgLSBtb2RlbGxlZCBmaXQKIyAgIGFyZWFfdW4gPC0gdW5saXN0KGFyZWFsaXN0KQojICAgdG90YWxhcmVhIDwtIGludGVncmF0ZShzcF9mdW4sIDgwLCBtYXh0ZW1wLCBzdWJkaXZpc2lvbnMgPSA4MDAwLCByZWwudG9sID0gdG9sKVsxXQojICAgdG90YWxhcmVhX2ludCA8LSBhcy5udW1lcmljKHVubGlzdCh0b3RhbGFyZWEpKQojICAgCiMgICAjQ2FsY3VsYXRlIHRvdGFsIGFyZWEgdGhlIHJpZ2h0IHdheQojICAgZnJhY3Rpb25zIDwtIGMoKQojICAgZm9yICh5IGluIDE6bGVuZ3RoKHRlbXBzKSkgewojICAgICB0aGlzdGVtcCA8LSB0ZW1wc1t5XQojICAgICBDTzJhcmVhIDwtIDAKIyAgICAgaWYgKHkgPT0gMSkgewojICAgICAgIENPMmFyZWFfaW50IDwtIGludGVncmF0ZShzcF9mdW4sIDgwLCB0ZW1wc1t5XSwgc3ViZGl2aXNpb25zID0gMTAwMDAsIHJlbC50b2wgPSB0b2wpWzFdCiMgICAgICAgQ08yYXJlYSA8LSBhcy5udW1lcmljKHVubGlzdChDTzJhcmVhX2ludCkpCiMgICAgICAgZnJhY3Byb3BvcnRpb24gPC0gQ08yYXJlYSAvIHRvdGFsYXJlYV9pbnQKIyAgICAgICBmcmFjdGlvbnMgPC0gYyhmcmFjdGlvbnMsIGZyYWNwcm9wb3J0aW9uKQojICAgICB9IGVsc2UgewojICAgICAgIHRlbXBsb3dlciA8LSB0ZW1wc1t5LTFdCiMgICAgICAgQ08yYXJlYV9pbnQgPC0gaW50ZWdyYXRlKHNwX2Z1biwgdGVtcGxvd2VyLCB0ZW1wc1t5XSwgc3ViZGl2aXNpb25zID0gODAwMCwgcmVsLnRvbCA9IHRvbClbMV0KIyAgICAgICBDTzJhcmVhIDwtIGFzLm51bWVyaWModW5saXN0KENPMmFyZWFfaW50KSkKIyAgICAgICBmcmFjcHJvcG9ydGlvbiA8LSBDTzJhcmVhIC8gdG90YWxhcmVhX2ludAojICAgICAgIGZyYWN0aW9ucyA8LSBjKGZyYWN0aW9ucywgZnJhY3Byb3BvcnRpb24pCiMgICAgIH0KIyAgIH0KIyAgIGRhdGEuZnJhbWUodGVtcF91ID0gdGVtcHMsIGNfcGN0ID0gZnJhY3Rpb25zICogMTAwKQojIH0KIyBjZnJjLmxzIDwtIGxhcHBseShzZXFfYWxvbmcoY3N2bGlzdCksIGZ1bmN0aW9uKGkpIHsKIyAgIGZyYy5meChjc3ZsaXN0W1tpXV0sIAojICAgICAgICAgIEhGX3RtbC50ZW1wcy5kZltncmVwKHN1YnN0cihuYW1lcyhjc3ZsaXN0KVtpXSwgMSwgMiksIEhGX3RtbC50ZW1wcy5kZiRQTSksICJ0ZW1wIl0pCiMgfSkKIyBuYW1lcyhjZnJjLmxzKSA8LSBuYW1lcyhjc3ZsaXN0KQojIAojICMgZ2V0IEMgY29udGVudAojIGxhcHBseShzZXFfYWxvbmcoY2ZyYy5scyksIGZ1bmN0aW9uKGkpIHsKIyAgIGlmIChpID09IDEpIHsKIyAgICAgc3VtKGNmcmMubHNbW2ldXVtbImNfcGN0Il1dWzVdLCBjZnJjLmxzW1tpXV1bWyJjX3BjdCJdXVs2XSkKIyAgIH0gZWxzZSB7CiMgICAgIGNmcmMubHNbW2ldXVtbImNfcGN0Il1dWzZdCiMgICB9CiMgfSkKCiMgdXNlIFNoYW5lJ3MgZnVuY3Rpb25zCnNvdXJjZSgiLi91dGlsaXRpZXMvRnJhY3Rpb25TaXplcy5SIikKCkFOd2YudG1sLmMuZGlzdCA8LSBGcmFjdGlvblNpemVzKAogIGNzdiA9IEFOd2YuMzAuSEZfdG1sLCAKICB0ZW1wc19pbiA9IEhGX3RtbC50ZW1wcy5kZltIRl90bWwudGVtcHMuZGYkUE0gPT0gIkFOIiwgInRlbXAiXSkKQlN3Zi50bWwuYy5kaXN0IDwtIEZyYWN0aW9uU2l6ZXMoCiAgY3N2ID0gQlN3Zi4zMC5IRl90bWwsIAogIHRlbXBzX2luID0gSEZfdG1sLnRlbXBzLmRmW0hGX3RtbC50ZW1wcy5kZiRQTSA9PSAiQlMiLCAidGVtcCJdKQpHUndmLnRtbC5jLmRpc3QgPC0gRnJhY3Rpb25TaXplcygKICBjc3YgPSBHUndmLjMwLkhGX3RtbCwgCiAgdGVtcHNfaW4gPSBIRl90bWwudGVtcHMuZGZbSEZfdG1sLnRlbXBzLmRmJFBNID09ICJHUiIsICJ0ZW1wIl0pCgpGbURpc3QuZnggPC0gZnVuY3Rpb24oc2FtcGxlLCByYW1wLCBGbVRlbXAsIGJ1bGtGbSkgewogIAogICMgZ2V0IGxlbmd0aAogIGxlbl9yYW1wIDwtIHdoaWNoKHJhbXAkdGVtcCA9PSA3NzUpCgogICMjIEdyYWIgb25seSByZWxldmFudCBkYXRhIHdpdGggbmV3IFJQTyBzbW9vdGhpbmcgb3V0cHV0cwogIHJhbXAgPC0gcmFtcFsxOmxlbl9yYW1wLCBdCiAgcmFtcCRDTzJfcHJvcCA9IHJhbXAkTW92aW5nIC8gbWF4KHJhbXAkTW92aW5nLCBuYS5ybSA9IFRSVUUpCgogICMjIFRoZXJtb2dyYW0KICAjIFRlbXBlcmF0dXJlIHJhbXAsIHdpdGggaW50ZXJ2YWxzIGZvciBpbnRlcnBvbGF0aW9uID0gcmVzbyAoZGVmYXVsdCA9IDAuMSkKICBodCA8LSBzZXEoMTAwLCA3NzUsIGJ5ID0gLjEpCiAgcnNwIDwtIHNwbGluZShyYW1wJHRlbXAsIHJhbXAkQ08yX3Byb3AsIHhvdXQgPSBodCkKICAKICAjIyBDYWxjdWxhdGUgdG90YWwgYXJlYSB1bmRlciBjdXJ2ZQogIHRvdEFVQyA8LSBBVUMoaHQsIHJzcCR5LCBtZXRob2QgPSAnc3BsaW5lJywgc3ViZGl2aXNpb25zID0gbGVuZ3RoKGh0KSkKICAKICAjIGxvb3AKICBBcmVhIDwtIGh0CiAgbiA8LSAxCiAgY29uZCA8LSBjKHJlcChUUlVFLCBsZW5ndGgoaHQpIC0gMSksIEZBTFNFKQogIGZvciAodCBpbiBodCkgewogICAgaWYgKGNvbmRbbl0pIHsKICAgICAgQXJlYVtuXSA8LSBBVUMoaHQsIHJzcCR5LCBmcm9tID0gdCwgdG8gPSBodFtuICsgMV0sIG1ldGhvZCA9ICdzcGxpbmUnKSAvIHRvdEFVQwogICAgfSBlbHNlIHsKICAgICAgQXJlYVtuXSA8LSBBVUMoaHQsIHJzcCR5LCBmcm9tID0gdCwgdG8gPSBodFtuXSwgbWV0aG9kID0gJ3NwbGluZScpIC8gdG90QVVDCiAgICB9CiAgICAKICAgICMgdXBkYXRlIGNvdW50ZXIKICAgIG4gPC0gbiArIDEKICB9CiAgCiAgIyBnZXQgbmF0dXJhbCBjdWJpYyBzcGxpbmUgZml0CiAgZm1fc3BfbkN1YiA8LSBzcGxpbmUoeSA9IGJ1bGtGbSwgeCA9IEZtVGVtcCwgbWV0aG9kID0gJ25hdHVyYWwnLCB4b3V0ID0gaHQpCiAgCiAgIyBDcmVhdGUgZGF0YSBmcmFtZSB3aXRoIG5hdHVyYWwgY3ViaWMgc3BsaW5lIGZpdAogIGRmX3NwIDwtIGRhdGEuZnJhbWUodGVtcCA9IGh0LCBhcmVhID0gQXJlYSwgZm1fc3BfbkN1YiA9IGZtX3NwX25DdWIkeSkKICAKICAjIHNwbGluZSBmaXQgc3RhdHMKICBOQ3Vic3RhdHMgPC0gYygKICAgIHdxbnRsID0gSG1pc2M6Ond0ZC5xdWFudGlsZSgKICAgICAgZGZfc3AkZm1fc3BfbkN1YiwgCiAgICAgIHdlaWdodHMgPSBkZl9zcCRhcmVhLAogICAgICBub3Jtd3QgPSBUUlVFLCAKICAgICAgcHJvYnMgPSBjKDAuMSwgMC4yNSwgMC41LCAwLjc1LCAwLjkpKSwKICAgIHdtZWFuID0gSG1pc2M6Ond0ZC5tZWFuKAogICAgICBkZl9zcCRmbV9zcF9uQ3ViLCAKICAgICAgd2VpZ2h0ID0gZGZfc3AkYXJlYSkpCgogICMgZ2V0IGhpcwogIE5DdWJIaXN0IDwtIHBsb3RyaXg6OndlaWdodGVkLmhpc3QoCiAgICBkZl9zcCRmbV9zcF9uQ3ViLCAKICAgIGRmX3NwJGFyZWEsIAogICAgZnJlcSA9IEZBTFNFLAogICAgbWFpbiA9ICdOYXR1cmFsIEN1YmljIFNwbGluZSwgV2VpZ2h0ZWQnLCAKICAgIGJyZWFrcyA9IHNlcShmcm9tID0gbWluKGRmX3NwJGZtX3NwX25DdWIpLCB0byA9IG1heChkZl9zcCRmbV9zcF9uQ3ViKSwgbGVuZ3RoLm91dCA9IDEwMDApLCAKICAgIHBsb3QgPSBGQUxTRSkKICAKICAjIHJldHVybgogIGxpc3Qoc3RhdHMgPSBkYXRhLmZyYW1lKHNhbXBsZSwgTkN1YnN0YXRzKSwKICAgICAgIGRlbnNpdHkgPSBkYXRhLmZyYW1lKHNhbXBsZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNaWRGbSA9IHNlcShmcm9tID0gMC4wLCB0byA9IDIsIGxlbmd0aC5vdXQgPSAxMDAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5DdWIgPSBjKDAsIE5DdWJIaXN0JGRlbnNpdHkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTkN1YkRlbnMgPSBkZW5zaXR5KE5DdWJIaXN0JGRlbnNpdHksIG4gPSAxMDAwKSR5KSwKICAgICAgIGFyZWEgPSBkYXRhLmZyYW1lKGFyZWEgPSBkZl9zcCRhcmVhLCAKICAgICAgICAgICAgICAgICAgICAgICAgIE5DdWJfRm0gPSBkZl9zcCRmbV9zcF9uQ3ViLAogICAgICAgICAgICAgICAgICAgICAgICAgTkN1Yl8xNGMgPSBjb252ZXJ0X2ZtX2QxNGMoZm0gPSBkZl9zcCRmbV9zcF9uQ3ViLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JzX2RhdGVfeSA9IDIwMTksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyYm9zZSA9IEZBTFNFKSkpCn0KCkFOd2YudG1sLmZtLmRpc3QgPC0gRm1EaXN0LmZ4KAogICJBTndmIiwgCiAgcmFtcCA9IEFOd2YuMzAuSEZfdG1sLCAKICBGbVRlbXAgPSBBTndmLnRtbC5jLmRpc3RbWzFdXVtbIjUwdGgtVGVtcCJdXVsyOjZdLAogIGJ1bGtGbSA9IGZyYy4xNGMuZGZbZnJjLjE0Yy5kZiRQTSA9PSAiQU4iLCAiZm0iXSkKCkJTd2YudG1sLmZtLmRpc3QgPC0gRm1EaXN0LmZ4KAogICJCU3dmIiwgCiAgcmFtcCA9IEJTd2YuMzAuSEZfdG1sLCAKICBGbVRlbXAgPSBCU3dmLnRtbC5jLmRpc3RbWzFdXVtbIjUwdGgtVGVtcCJdXVsyOjZdLAogIGJ1bGtGbSA9IGZyYy4xNGMuZGZbZnJjLjE0Yy5kZiRQTSA9PSAiQlMiLCAiZm0iXSkKCkdSd2YudG1sLmZtLmRpc3QgPC0gRm1EaXN0LmZ4KAogICJHUndmIiwgCiAgcmFtcCA9IEdSd2YuMzAuSEZfdG1sLCAKICBGbVRlbXAgPSBHUndmLnRtbC5jLmRpc3RbWzFdXVtbIjUwdGgtVGVtcCJdXVsyOjZdLAogIGJ1bGtGbSA9IGZyYy4xNGMuZGZbZnJjLjE0Yy5kZiRQTSA9PSAiR1IiLCAiZm0iXSkKCiMgY29tYmluZSBhbmQgcGxvdAp4bGltIDwtIGNvbnZlcnRfZm1fZDE0YygKICBmbSA9IGMobWluKEFOd2YudG1sLmZtLmRpc3Qkc3RhdHMkTkN1YnN0YXRzLAogICAgICAgICAgICAgQlN3Zi50bWwuZm0uZGlzdCRzdGF0cyROQ3Vic3RhdHMsCiAgICAgICAgICAgICBHUndmLnRtbC5mbS5kaXN0JHN0YXRzJE5DdWJzdGF0cykgLSAuMDQsCiAgICAgICAgIG1heChBTndmLnRtbC5mbS5kaXN0JHN0YXRzJE5DdWJzdGF0cywKICAgICAgICAgICAgIEJTd2YudG1sLmZtLmRpc3Qkc3RhdHMkTkN1YnN0YXRzLAogICAgICAgICAgICBHUndmLnRtbC5mbS5kaXN0JHN0YXRzJE5DdWJzdGF0cykgKyAuMDQpLAogIG9ic19kYXRlX3kgPSAyMDE5LCB2ZXJib3NlID0gRkFMU0UpCnJiaW5kKAogIGRhdGEuZnJhbWUoUE0gPSAiYW5kZXNpdGUiLCBBTndmLnRtbC5mbS5kaXN0JGFyZWEpLAogIGRhdGEuZnJhbWUoUE0gPSAiYmFzYWx0IiwgQlN3Zi50bWwuZm0uZGlzdCRhcmVhKSwKICBkYXRhLmZyYW1lKFBNID0gImdyYW5pdGUiLCBHUndmLnRtbC5mbS5kaXN0JGFyZWEpKSAlPiUKICBnZ3Bsb3QoLikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBnZW9tX2RlbnNpdHkoYWVzKHggPSBOQ3ViXzE0YywgeSA9IC4uZGVuc2l0eS4uLCB3ZWlnaHQgPSBhYnMoYXJlYSksIAogICAgICAgICAgICAgICAgICAgZmlsbCA9IFBNLCBjb2xvciA9IFBNKSwgYWxwaGEgPSAuNikgKwogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gIlBhcmVudCBtYXRlcmlhbCIsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImFuZGVzaXRlIiA9IGFuZGVzaXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYXNhbHQiID0gYmFzYWx0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJncmFuaXRlIiA9IGdyYW5pdGUpKSArCiAgc2NhbGVfZmlsbF9tYW51YWwobmFtZSA9ICJQYXJlbnQgbWF0ZXJpYWwiLAogICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImFuZGVzaXRlIiA9IGFuZGVzaXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhc2FsdCIgPSBiYXNhbHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3Jhbml0ZSIgPSBncmFuaXRlKSkgKwogIHhsaW0oeGxpbSkgKwogIHhsYWIoZXhwcmVzc2lvbignQy13ZWlnaHRlZCAnKkRlbHRhKicnXjE0KidDICjigLApJykpICsgCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCg==